Отправляет email-рассылки с помощью сервиса Sendsay

[TC] Скрипты Джоз. Ожидание инфы, клик по ссылке.

Здравствуйте, господа подписчики.

Возьмём гипотетическую веб-страницу с некоторым количеством текстовой
информации и ссылками "обновить", "следующая" и "предыдущая". Задача:
1. На странице мы будем искать слово "оранжевый" и при его появлении
совершать переход по ссылке "следующая", т.е. как только появилось слово
"оранжевый" джоз кликает по ссылке "следующий". Слово "оранжевый" может
появиться только при обновлении страницы, т.к. текст на странице
статический. Следовательно, раз в x секунд страницу нужно обновлять путём
нажатия на ссылку "обновить".
2. После того, как загрузилась страница по ссылке "следующая" мы смотрим на
новую страницу. Если на ней есть слово "мебель", то ищем и нажимаем ссылку
"хорошо", а если слова "мебель" нет, а есть слово "телефоны", то нажимаем
ссылку "плохо". В третьем случае, если нет ни "мебель", ни "телефоны", то
нажимаем ссылку "обновить" и продолжаем ждать появления либо "мебель", либо
"телефоны".

Проблема, собственно, в том, как организовать этот цикл ожидания средствами
джоз? А если точнее, как отследить событие загрузки страници и появления
текста. Ставить какой-то конкретный интервал, допустим, в 30 секунд
ожидания - не выход. Страница может загрузиться как за 0,2 сек, так и за 88
сек. Во втором случае скрипт не сработает, если мы поставим ему время
ожидания, к примеру, 30 сек.

Нужный текст "мебель", "телефоны" и т. д. мы можем легко отследить так:

*code*

if FindString (GetAppMainWindow (GetCurrentWindow ()), "мебель", S_BOTTOM,
S_RESTRICTED) then

FindString (GetAppMainWindow (GetCurrentWindow ()), "купить", S_BOTTOM,
S_RESTRICTED)

EnterKey()

EndIf

*code*

Ожидание интервала x секунд также не проблема. Мы можем организовать его с
помощью глобальной переменной и функции

ScheduleFunction (), например, так:

*code*

let WaitVar=ScheduleFunction ("WaitForPhones", 100)

*code*

Главное здесь - это дать понять джозу, что страница именно загрузилась и
можно приступать к поиску необходимого текста.

Может быть реально вобще обойтись без ScheduleFunction()? Зачем
устанавливать какой-то жёсткий интервал, если он заранее не известен?
Возможно ли кликать на ссылку как только на странице появляется слово
мебель"? Как-то пробовал сделать это через цикл while, но по-моему ничего не
получилось.

Ответить   Игорь Лялин Fri, 11 Feb 2011 01:25:56 +0300 (#1419049)

 

Ответы:

Доброго времени суток, Игорь.

Из сообщения от 11.02.2011 0:27:

В первом приближении используйте событийную функцию
DocumentLoadedEvent ()
Дополнительно можно проконтролировать текст статусной строки.

Дальнейшие усилия, если простое решение не удовлетворит,
прилагайте в направлении использования DOM
через COM интерфейс.

С уважением, Руслан Усачев

Ответить   Fri, 11 Feb 2011 09:08:36 +0200 (#1419364)

 

Здравствуйте, Руслан.

Sent: Friday, February 11, 2011 10:08 AM

Наколдовал что-то более-менее работчее, но с поразительным глюком (о чём в
конце).

1. В Globals добавляем переменную iMarker.

2. Пишем Функцию.

Void Function StartProcess ()

if FindString (GetAppMainWindow (GetCurrentWindow ()), "Мебель", S_TOP,
S_RESTRICTED) then

let iMarker=false

SayString ("Искомое слово найдено")

return

else

FindString (GetAppMainWindow (GetCurrentWindow ()), "Следующая страница",
S_TOP, S_RESTRICTED)

EnterKey ()

let iMarker=true

EndIf

EndFunction

3. Пишем скрипт для включения.

Script AutoBrowsing ()

if IsSameScript () then

let iMarker=false

SayString ("Стоп")

Else

let iMarker=true

SayString ("Старт")

EndIf

EndScript

4. В самый конец функции DocumentLoadedEvent () вставляем следующее:

if iMarker then

StartProcess ()

EndIf

Как видно из функции, мы ищем слово "мебель" на каждой странице. Если его
нет - переходим на следующую, если есть - останавливаемся. К примеру,
"мебель" встречается на восьмой странице. Но если в DocumentLoadedEvent
оставить всё так, как я написал выше, то автопереход произойдёт только один
раз.

Однако совершенно случайно обнаружил, что конструкция, вроде бы, работает
стабильно, если после каждой прогрузки страницы (до того, как синтезатор
начал её зачитывать, нажимать ctrl - т.е. обрубать речь. И действительно,
если в конец DocumentLoadedEvent () вставить StopSpeech() перед конструкцией

if iMarker then

StartProcess ()

EndIf

Чтобы получилось следующим образом:

Void Function DocumentLoadedEvent ()

SetUpStuffForNewPage ();Personalized Settings

SpeakPersonalizeSettingsChange ()

DocumentLoadedEvent ()

StopSpeech ()

if iMarker then

StartProcess ()

EndIf

EndFunction

То задумка работает. Отключение синтезатора перед запуском скрипта не
помогает. В чём тут может быть дело? Глюк Джоза/фокса или руки?

Ответить   Игорь Лялин Sat, 12 Feb 2011 02:58:10 +0300 (#1420582)

 

Привет Игорь!
часто перехват системных функций выглядит так
Void Function НашаФункция ()
;далее исполняемый код
;и отдача функции JAWS
НашаФункция ()
EndFunction
случаи конечно бывают разные
тоесть иногда системе дают отрабоотать по этой функции и лишь потом вставляют
свой код.
это я к тому что попробуй так

Void Function DocumentLoadedEvent ()
SetUpStuffForNewPage ();Personalized Settings
SpeakPersonalizeSettingsChange ()

if iMarker then
return StartProcess ()
EndIf
DocumentLoadedEvent ()
EndFunction
можно так же попробовать без ретурн.
тоесть насколько понимаю работу этой функции в приведённом примере в случае с
обновлением страницы сработает поиск и не даст системе начать читать страницу
Виктор

Ответить   Sat, 12 Feb 2011 05:34:03 +0300 (#1420643)