Что нового

Как поместить указатель мыши на ссылку в FireFox?

edyapd

Осваивающий
Сообщения
380
Репутация
30
bescom сказал(а):
Я такие ссылки условно называю неправильными. При помощи IsArray() проверка на правильность работает, и, если ссылка неправильная, нужно снова вызвать URLFromArray(), чтобы получить новую случайную ссылку, и снова попробовать на правильность. Не прошло - снова и снова, пока не найдется правильная ссылка и скрипт не перейдет к клику по ней.
У меня не получается работать с FF, по этому в код не стал сильно вникать. Но если там сделано так, как вы описываете, то моё мнение, это не правильно.

Что, как я понял делаете вы:
Получаете все ссылки
Случайным образом выбираете одну
И только потом проверяете на валидность.
Если всё нормально, то переход.

Я бы сделал так:
Получил все ссылки со страницы.
Проверил их на валидность
И уже среди отобранных случайным образом выбирал ту, по которой надо кликнуть.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Не нужно выделять текст.
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
edyapd сказал(а):
Я бы сделал так:
Получил все ссылки со страницы.
Проверил их на валидность
И уже среди отобранных случайным образом выбирал ту, по которой надо кликнуть.
Это было бы логичным в другой ситуации, но не в этой. На странице бывает по несколько тысяч ссылок, и в Вашем варианте нужно проверить на валидность их все. В моем - берем случайную, проверяем, если нет - выбираем другую. По статистике - это на редких страницах максимум 1 правильная на 5 неправильных, причем я рассматриваю самый тяжелый случай. Разница, надеюсь, понятна - тысячи действий против пяти.


Добавлено:
Сообщение автоматически объединено:

И давайте не отходить от темы. Вопрос совсем о другом.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
bescom а где в цикле клик по ссылке?
и где проверяется на валидность?
Код очень странный...
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
inververs, в цикле нет клика. Логика другая: при нахождении правильной ссылки производится выход из цикла и тогда уже клик.
Проверка на валидность - IsArray($aAll)=0
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
Проверяйте
Код:
Func GoTarget()
  Opt("WinTitleMatchMode", 2)
  Do
    $oParent = _UIA_GetElementFromHandle(WinActivate("Mozilla Firefox"))
    Sleep(30)
  Until IsObj($oParent)
  While 1
    URLFromArray()
    $urlstr1 = FileReadLine(@ScriptDir & "\ok_links.txt", 1)
    $aAll = _UIA_FindAllElements($oParent, "Value.Value", $urlstr1)
    If Not IsArray($aAll) Then
      Sleep(30)
      ContinueLoop
    EndIf
    For $i = 1 To $aAll[0]
      _UIA_ElementSetFocus($aAll[$i])
      If Not _UIA_ElementGetPropertyValue($aAll[$i], "IsOffscreen") Then
        $aRect = _UIA_ElementGetBoundingRectangle($aAll[$i])
        $x = Random(50, 1000)
        $y = Random(200, 700)
        MouseMove($x, $y, Random(5, 30))
        Sleep(200)
        MouseClick("left", ($aRect[0] + ($aRect[2] - $aRect[0]) / 2) + Random(-10, 10, 1), ($aRect[1] + ($aRect[3] - $aRect[1]) / 2) + Random(-1, 1, 1))
        ExitLoop 2
      EndIf
    Next
  WEnd
  _FFLoadWait()
EndFunc
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
InnI, происходит то же самое. Собственно, Вы окультурили предыдущий код, но суть осталась та же, и зацикливается он точно так же, не находя существующие на странице ссылки. :stars:
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
Цикл While будет работать до тех пор, пока не найдёт и не кликнет ссылку, значение "Value.Value" которой точно совпадает со строкой из файла. Если он "зацикливается", значит полного совпадения нет и нужно проводить дополнительное сравнение по части строки. Покажите, как выглядит одна и та же ссылка в файле и как её отображает утилита Inspect.

Кстати, почему бы вам в функции URLFromArray() не формировать из "неправильных" ссылок "правильные"?
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
Да в том и дело, что полные совпадения есть, и переходы по ним же идут до того момента, пока скрипт не наткнется на неправильную ссылку, а потом зацикливается.

Неправильная ссылка (кликабельно):



Оно же в исходном коде страницы:



А вот правильная ссылка, она и в коде абсолютно такая же, но, встретившись с ней после неправильной, функция ее уже не видит:




Добавлено:
Сообщение автоматически объединено:

InnI [?]
Кстати, почему бы вам в функции URLFromArray() не формировать из "неправильных" ссылок "правильные"?
Каким образом? По идее, этот вариант даже лучше.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
а потом зацикливается
Значит ваша функция URLFromArray() либо не обновляет первую строку в файле, либо там всё время "неправильные" ссылки.

в исходном коде страницы
Я вас просил показать первую строку файла. Вот эту: $urlstr1

Добавить в строки отсутствующие части ссылки.

Вот поиск по части строки. Пробуйте
Код:
Func GoTarget()
  Opt("WinTitleMatchMode", 2)
  Do
    $oParent = _UIA_GetElementFromHandle(WinActivate("Mozilla Firefox"))
    Sleep(30)
  Until IsObj($oParent)
  While 1
    URLFromArray()
    $urlstr1 = FileReadLine(@ScriptDir & "\ok_links.txt", 1)
    $aLinks = _UIA_FindAllElements($oParent, "ControlType", $UIA_HyperlinkControlTypeId)
    $aAll = _UIA_FindElementsInArray($aLinks, "Value.Value", $urlstr1, True)
    If Not IsArray($aAll) Then
      Sleep(30)
      ContinueLoop
    EndIf
    For $i = 1 To $aAll[0]
      _UIA_ElementSetFocus($aAll[$i])
      If Not _UIA_ElementGetPropertyValue($aAll[$i], "IsOffscreen") Then
        $aRect = _UIA_ElementGetBoundingRectangle($aAll[$i])
        $x = Random(50, 1000)
        $y = Random(200, 700)
        MouseMove($x, $y, Random(5, 30))
        Sleep(200)
        MouseClick("left", ($aRect[0] + ($aRect[2] - $aRect[0]) / 2) + Random(-10, 10, 1), ($aRect[1] + ($aRect[3] - $aRect[1]) / 2) + Random(-1, 1, 1))
        ExitLoop 2
      EndIf
    Next
  WEnd
  _FFLoadWait()
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
bescom вы можете сделать все проще через браузер IE.
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
InnI [?]
Значит ваша функция URLFromArray() либо не обновляет первую строку в файле, либо там всё время "неправильные" ссылки.
Что ж Вы мне не верите-то... Вот список ссылок из последнего запуска скрипта с Вашим последним вариантом кода:

Код:
http://bescomblog.com/?page_id=4089&replytocom=3824#respond
http://bescomblog.com/?page_id=4089&replytocom=4024#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3742
http://bescomblog.com/?page_id=4089&cpage=1#comment-3747
http://bescomblog.com/?page_id=4089&replytocom=3771#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3739
http://bescomblog.com/?p=5053
http://bescomblog.com/?page_id=4089&replytocom=3841#respond
http://bescomblog.com/?p=4133
http://bescomblog.com/?page_id=4089&cpage=1#comment-3824
http://bescomblog.com/?page_id=4089&replytocom=3799#respond
http://bescomblog.com/?page_id=4089&replytocom=3494#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3485
http://bescomblog.com/?page_id=4089&replytocom=3490#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3570
http://bescomblog.com/?page_id=4089&replytocom=3570#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3618
http://bescomblog.com/?page_id=4089&replytocom=3811#respond
http://bescomblog.com/?page_id=4089&replytocom=3743#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3830
http://bescomblog.com/?page_id=4089&cpage=1#comment-3930
http://bescomblog.com/?page_id=4089&replytocom=3824#respond
http://bescomblog.com/?page_id=4089&replytocom=3498#respond
http://bescomblog.com/?page_id=4089&replytocom=3520#respond
http://bescomblog.com/?page_id=4089&replytocom=3966#respond
http://bescomblog.com/?page_id=4089&cpage=1#comment-3968
http://bescomblog.com/?page_id=4089&cpage=1#comment-3822
http://bescomblog.com/?page_id=4089&cpage=1#comment-3592

Логирование было установлено вот так:

Код:
If Not IsArray($aAll) Then
	   FileWriteLine(@ScriptDir&"\errors.txt", $urlstr1)
      Sleep(30)
      ContinueLoop
    EndIf


Как видно из списка, функция прошла несколько неправильных ссылок, как и должно быть, а потом точно так же среагировала на правильные. Согласитесь, при таких ссылках условие If Not IsArray($aAll) вообще не должно срабатывать, так как ссылка в том виде на странице есть, в исходном коде в том же виде. Можете проверить, страница все та же, адрес на предыдущих скринах.

Я вас просил показать первую строку файла. Вот эту: $urlstr1

Сразу не понял. Ну, собственно, список - оно как раз и есть.

Добавить в строки отсутствующие части ссылки.

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


Добавлено:
Сообщение автоматически объединено:

inververs сказал(а):
bescom вы можете сделать все проще через браузер IE.
К сожалению, не могу - IE бесполезен для меня, так как под него не существует плагинов, которые мне нужны, и это не единственная причина. Если бы не эти обстоятельства - да, делал бы на IE, ибо действительно проще.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
адрес на предыдущих скринах
Там указан адрес "http://bescomblog.com/?page_id=1941". На странице 1941 нет вхождений "?page_id=4089" и быть не может. Все эти вхождения находятся по адресу "http://bescomblog.com/?page_id=4089". Если перейти на страницу 4089, то у меня прокликивается каждая строчка из файла логирования.
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
InnI [?]
На странице 1941 нет вхождений "?page_id=4089" и быть не может
Ой... Что-то я не обратил внимания... Завтра буду разбираться...


Добавлено:
Сообщение автоматически объединено:

InnI, я действительно косякнул, когда давал Вам прошлый лог. Видимо, страницу дал одну, а лог от другого запуска. В остальном я по-прежнему настаиваю - функция не всегда делает клик по нужной ссылке, однако оказалось, что дело не в неправильности или правильности ссылки. Я тут провел некоторые исследования, и закономерности кое-какие нашел.

Сначала я заметил, что на http://bescomblog.com/?page_id=1941 зацикливание не возникает никогда, то есть абсолютно, а на http://bescomblog.com/?page_id=4089 почти всегда, причем даже если первой идет правильная ссылка. А чем эти страницы отличаются? Шаблон оформления один, структура тоже, построение ссылок тоже. Чем тогда? А тем, что на http://bescomblog.com/?page_id=4089 есть видео, для воспроизведения которого используется Adobe Shockwave Flash. Как это влияет на работу AutoIt и Вашей библиотеки, я не знаю, но что влияет - факт. Я пошел таким путем: взял три компьютера (Win 7 Ult 64, Win 7 Home 32, XP SP3), на двух из которых еще и есть виртуалки VMWare с XP SP3, и провел серию многократных запусков скрипта. Вот итоги:

На Win 7 зацикливание воспроизвести не удалось вообще никак: хоть правильные ссылки, хоть неправильные - ходит и не зацикливается. То же самое на той виртуалке, где XP SP3 и старый Adobe Shockwave Flash версии 12. А вот на компе с XP SP3 и новым Adobe Shockwave Flash версии 17 и виртуалке с XP SP3 с таким же плагином зацикливается со стопроцентной вероятностью. Получается, что XP SP3 и Adobe Shockwave Flash 17 версии не дают правильно работать написанной Вами функции, если на странице есть контент, для воспроизведения которого нужен Adobe Shockwave Flash. Простое выключение плагина в FF эффекта не дает, удалить его из системы или откатить на более старую версию тоже ой-как проблемно, лично у меня не получилось.

И еще одно интересное наблюдение, о котором я уже писал. Если скрипт зациклился и никак не выходит из этого состояния, достаточно навести мышку на значок скрипта в трее, как скрипт выходит из цикла и нормально кликает по ссылке. Вот что это, а? :'(
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
зацикливается со стопроцентной вероятностью
Там три цикла. В каком конкретно месте зацикливается? И как выглядит ссылка $urlstr1 при зацикливании?

Для упрощения отладки можно включить опцию
Код:
Opt("TrayIconDebug", 1)
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
InnI [?]
В каком конкретно месте зацикливается?
Здесь:
Код:
If Not IsArray($aAll) Then
			If $log = 1 Then
			   FileWriteLine(@ScriptDir&"\log.txt", "URL для клика не найден - "&$urlstr1) 			; Пишем в файл URL, который не найден
			EndIf
      Sleep(30)
      ContinueLoop
    EndIf


Ссылка выглядит обычно, вот кусок лога, полученного из непрекращающегося цикла:
Код:
URL для клика не найден - http://bescomblog.com/?p=4179
URL для клика не найден - http://bescomblog.com/?page_id=4089&cpage=1#comment-3802
URL для клика не найден - http://bescomblog.com/?page_id=4089&cpage=1#comment-3845

Opt("TrayIconDebug", 1) включена изначально. Во время "замыкания" показывает 413 строку Вашей библиотеки UIAutomate.au3
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
К сожалению, воспроизвести не удаётся. Одно точно: элементы не найдены. Причина - несоответствие строки файла и значения параметра "Value.Value".
Что могу предложить? Добавить вывод значений всех изначально найденных ссылок. Посмотрите, есть ли среди них искомая
Код:
If Not IsArray($aAll) Then
            If $log = 1 Then
               FileWriteLine(@ScriptDir&"\log.txt", "URL для клика не найден - "&$urlstr1) ; Пишем в файл URL, который не найден
               For $idx = 1 To $aLinks[0]
                  FileWriteLine(@ScriptDir&"\log.txt", _UIA_ElementGetPropertyValue($aLinks[$idx], "Value.Value"))
               Next
               Exit
            EndIf
      Sleep(30)
      ContinueLoop
    EndIf
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
"воспроизвести не удаётся" - если не XP + новый Shockwave Player, то и не удастся. Если другая комбинация, то работает, как часы.


InnI [?]
Добавить вывод значений всех изначально найденных ссылок. Посмотрите, есть ли среди них искомая
Так у меня и так ранее массив пишется в файл. И да, ссылки в нем есть, из него они и извлекаются.

К слову - я не понял, $aLinks[0] мы откуда берем?

И еще - почему Вы не рассматриваете мою версию как небредовую хотя бы на минуту? Я ведь действительно воспроизвожу все описанное в XP + новый Shockwave Player и не наблюдаю в клоне той же виртуалки, но со старым Shockwave Player...
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
bescom
ранее массив пишется в файл
Меня не интересует раньше или позже. Меня интересует конкретный момент времени, когда прошла выборка ссылок. Тем более, что, насколько я понял, массив для файла вы формируете не функциями UIAutomation.

не понял, $aLinks[0] мы откуда берем
Ответ #29 (под спойлером)

bescom
почему Вы не рассматриваете мою версию
Потому что считаю, что код работает правильно. И проблемы на вашей стороне. Если вы не хотите помочь МНЕ в поиске ошибки, то я не смогу помочь ВАМ в её устранении. И, заметьте, мне это не надо - это нужно вам.


Добавлено:
Сообщение автоматически объединено:

VMware Player 5.0.1
WinXP SP3 x86
FireFox Portable 38.0.1
FlashPlayer 17.0.0.188
AutoIt 3.3.12.0
На странице "http://bescomblog.com/?page_id=4089" кликаются все 28 предоставленных вами ссылок.
 
Автор
bescom

bescom

Новичок
Сообщения
61
Репутация
0
А уж как я-то хочу помочь Вам, чтобы Вы помогли мне, чтобы все заработало... ;) До тошноты со скриптом занимаюсь уже который день...
Просто я уже вообще перестаю понимать, что куда, откуда и почему...

Сделал, как Вы сказали. На машине с Win 7 ходит без проблем, даже не заглядывая в участок кода с логированием списка ссылок. А на машине с XP и новым Шокоплеером вот:

SMC1Qgd.png



Добавлено:
Сообщение автоматически объединено:

InnI [?]
VMware Player 5.0.1WinXP SP3 x86FireFox Portable 38.0.1FlashPlayer 17.0.0.188AutoIt 3.3.12.0На странице "http://bescomblog.com/?page_id=4089" кликаются все 28 предоставленных вами ссылок.
А у меня хоть на виртуалках, хоть на простых машинах, воспроизводится именно так, как я описываю. И не FlashPlayer 17, а ShockWave.
Я могу завтра Вам хоть экранное видео снять, хоть расшарить экран по скайпу + предоставить полный код скрипта (только не для паблика). Ну иначе трудно убедить Вас, что творятся странные вещи. ;)
 
Верх