Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
Я такие ссылки условно называю неправильными. При помощи IsArray() проверка на правильность работает, и, если ссылка неправильная, нужно снова вызвать URLFromArray(), чтобы получить новую случайную ссылку, и снова попробовать на правильность. Не прошло - снова и снова, пока не найдется правильная ссылка и скрипт не перейдет к клику по ней.
У меня не получается работать с FF, по этому в код не стал сильно вникать. Но если там сделано так, как вы описываете, то моё мнение, это не правильно.
Что, как я понял делаете вы:
Получаете все ссылки
Случайным образом выбираете одну
И только потом проверяете на валидность.
Если всё нормально, то переход.
Я бы сделал так:
Получил все ссылки со страницы.
Проверил их на валидность
И уже среди отобранных случайным образом выбирал ту, по которой надо кликнуть.
Я бы сделал так:
Получил все ссылки со страницы. Проверил их на валидность
И уже среди отобранных случайным образом выбирал ту, по которой надо кликнуть.
Это было бы логичным в другой ситуации, но не в этой. На странице бывает по несколько тысяч ссылок, и в Вашем варианте нужно проверить на валидность их все. В моем - берем случайную, проверяем, если нет - выбираем другую. По статистике - это на редких страницах максимум 1 правильная на 5 неправильных, причем я рассматриваю самый тяжелый случай. Разница, надеюсь, понятна - тысячи действий против пяти.
Добавлено:
Сообщение автоматически объединено:
И давайте не отходить от темы. Вопрос совсем о другом.
inververs, в цикле нет клика. Логика другая: при нахождении правильной ссылки производится выход из цикла и тогда уже клик.
Проверка на валидность - IsArray($aAll)=0
InnI, происходит то же самое. Собственно, Вы окультурили предыдущий код, но суть осталась та же, и зацикливается он точно так же, не находя существующие на странице ссылки. :stars:
bescom
Цикл While будет работать до тех пор, пока не найдёт и не кликнет ссылку, значение "Value.Value" которой точно совпадает со строкой из файла. Если он "зацикливается", значит полного совпадения нет и нужно проводить дополнительное сравнение по части строки. Покажите, как выглядит одна и та же ссылка в файле и как её отображает утилита Inspect.
Кстати, почему бы вам в функции URLFromArray() не формировать из "неправильных" ссылок "правильные"?
Да в том и дело, что полные совпадения есть, и переходы по ним же идут до того момента, пока скрипт не наткнется на неправильную ссылку, а потом зацикливается.
Неправильная ссылка (кликабельно):
Оно же в исходном коде страницы:
А вот правильная ссылка, она и в коде абсолютно такая же, но, встретившись с ней после неправильной, функция ее уже не видит:
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, ибо действительно проще.
Там указан адрес "http://bescomblog.com/?page_id=1941". На странице 1941 нет вхождений "?page_id=4089" и быть не может. Все эти вхождения находятся по адресу "http://bescomblog.com/?page_id=4089". Если перейти на страницу 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 эффекта не дает, удалить его из системы или откатить на более старую версию тоже ой-как проблемно, лично у меня не получилось.
И еще одно интересное наблюдение, о котором я уже писал. Если скрипт зациклился и никак не выходит из этого состояния, достаточно навести мышку на значок скрипта в трее, как скрипт выходит из цикла и нормально кликает по ссылке. Вот что это, а? :'(
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
К сожалению, воспроизвести не удаётся. Одно точно: элементы не найдены. Причина - несоответствие строки файла и значения параметра "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
Так у меня и так ранее массив пишется в файл. И да, ссылки в нем есть, из него они и извлекаются.
К слову - я не понял, $aLinks[0] мы откуда берем?
И еще - почему Вы не рассматриваете мою версию как небредовую хотя бы на минуту? Я ведь действительно воспроизвожу все описанное в XP + новый Shockwave Player и не наблюдаю в клоне той же виртуалки, но со старым Shockwave Player...
Меня не интересует раньше или позже. Меня интересует конкретный момент времени, когда прошла выборка ссылок. Тем более, что, насколько я понял, массив для файла вы формируете не функциями UIAutomation.
Потому что считаю, что код работает правильно. И проблемы на вашей стороне. Если вы не хотите помочь МНЕ в поиске ошибки, то я не смогу помочь ВАМ в её устранении. И, заметьте, мне это не надо - это нужно вам.
Добавлено:
Сообщение автоматически объединено:
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 предоставленных вами ссылок.
А уж как я-то хочу помочь Вам, чтобы Вы помогли мне, чтобы все заработало... ;) До тошноты со скриптом занимаюсь уже который день...
Просто я уже вообще перестаю понимать, что куда, откуда и почему...
Сделал, как Вы сказали. На машине с Win 7 ходит без проблем, даже не заглядывая в участок кода с логированием списка ссылок. А на машине с XP и новым Шокоплеером вот:
А у меня хоть на виртуалках, хоть на простых машинах, воспроизводится именно так, как я описываю. И не FlashPlayer 17, а ShockWave.
Я могу завтра Вам хоть экранное видео снять, хоть расшарить экран по скайпу + предоставить полный код скрипта (только не для паблика). Ну иначе трудно убедить Вас, что творятся странные вещи. ;)