Что нового

Как находить с помощью AutoIt гиперссылки на веб странице

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток, всем.
Прошу помочь разобраться с написанием кода

Последовательность:
• Открываем веб страницу браузером Google Chrome (любую)
• AutoIt, по идее, находит гиперссылку: 4 шт – не более (ну как вариант)
• Открывает гиперссылку в новом окне, как и оставшиеся.
• Интервал открытия /перехода по гиперссылке составляет минимум 20 сек. максимум 30 сек. Т.е. если можно открытие и переход по ссылке проводить рандомно с временным промежутком от 20 до 30 сек. – то круто. (было бы просто невероятно интересно посмотреть как он реализуется)
Если механизм случайного выбора времени не получается реализовать, то можно просто фиксировано – с интервалом 20 сек. (что поделать).

Заранее спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

; путь к браузеру
Global $Path = "D:\Portable\GoogleChrome\GoogleChromePortable.exe"
; сайт
Global $URL = "autoit-script.ru"

; Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён
Run($Path & " --force-renderer-accessibility " & $URL)
$hWnd = WinWait(" - Google Chrome", "", 5)
If Not $hWnd Then Exit

; Создание элемента с использованием дескриптора окна
$oParent = _UIA_GetElementFromHandle($hWnd)

; Ожидание загрузки страницы по наличию текста "Обратная связь раздела "
_UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Обратная связь раздела ")
If @error Then Exit

; находим все ссылки на странице
$aLinks = _UIA_FindAllElements($oParent, "ControlType", $UIA_HyperlinkControlTypeId)
If @error Then Exit

; открываем четыре ссылки c 31 по 34 в новых вкладках
For $i = 31 To 34
  Run($Path & " " & _UIA_ElementGetPropertyValue($aLinks[$i], "ValueValue"))
  Sleep(Random(20, 30, 1) * 1000) ; ожидание от 20 до 30 сек
Next
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Спасибо
Как раз тестирую. У меня не всё выходит:
- браузер запустился
- вбил в поисковую строку адрес
- перешел по нему
- и...тишина. активности нет дальше :(
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
вбил в поисковую строку адрес
Данный пример работает автоматически. Адрес сайта нужно менять в скрипте в переменной $URL.
Если вы хотите вручную ходить по сайтам, то скрипт нужно переделать, чтобы он, например, по горячей клавише обрабатывал текущую страницу.
Я как понял ваше ТЗ, так и сделал.
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
Я как понял ваше ТЗ, так и сделал.
Извините, возможно я не так выразился.
Я просто комментировал поведение браузера - я сам не вносил изменений. Только путь к браузеру сменил.
Вы всё отлично поняли, всё норм.
Вопрос - не в том.
У меня почему то скрипт работу сам остановил, просто - сразу после ввода урла страницы стартового сайта. :(
Т.е. собственно, нет переходов только по ссылкам внутри веб страницы
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
сразу после ввода урл
Если вы ушли со страницы, которую открыл Chrome при запуске скрипта, то скрипту негде брать адреса (ссылок-то уже нет).
У вас в задании нет ни слова о работе с браузером во время выполнения скрипта. Просто запустите скрипт и ждите, пока Chrome откроет четыре ссылки. Между переходами по ссылкам выдерживается пауза от 20 до 30 секунд, как вы и просили.


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

dr.room
только по ссылкам внутри веб страницы
Ну, да. А вы чего хотели?
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
Просто запустите скрипт и ждите, пока Chrome откроет четыре ссылки.
Феноменально !
Всё получилось!
Я выполнил все Ваши рекомендации - вроде должно получится, а не идет у меня и всё тут, хотя должно.
И тут я вспоминаю что Punto Switcher мне уже пару раз помешал. Отключаю Авто переключение - и вуаля ! Всё прошло как по нотам!
Да здравствует InnI! :beer:
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
Вот вам ручной вариант.
Измените в скрипте путь к браузеру и запустите скрипт - скрипт запустит Chrome. Теперь вручную можете перейти на любую страницу. Когда нажмёте Ctrl+F1 скрипт на текущей странице прочитает ссылки и перейдёт по первым четырём с интервалом 20-30 сек. После чего вручную можете перейти на другую страницу и опять нажать Ctrl+F1. И так далее. Только до завершения открытия всех ссылок не закрывайте основную страницу (на которой нажали Ctrl+F1)
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

; путь к браузеру
Global $Path = "D:\Portable\GoogleChrome\GoogleChromePortable.exe"

; Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён
Run($Path & " --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 5)
If Not $hWnd Then Exit MsgBox(0, @ScriptName, "Окно браузера не найдено")

; Создание элемента с использованием дескриптора окна
$oParent = _UIA_GetElementFromHandle($hWnd)

HotKeySet("^{F1}", "Go")

While Sleep(1000)
WEnd

Func Go()
  HotKeySet("^{F1}")

  ; находим все ссылки на странице
  $aLinks = _UIA_FindAllElements($oParent, "ControlType", $UIA_HyperlinkControlTypeId)
  If @error Then Return MsgBox(0, @ScriptName, "На этой странице ссылки не найдены")
  If $aLinks[0] < 4 Then Return MsgBox(0, @ScriptName, "На этой странице меньше четырёх ссылок")

  ; открываем четыре первых ссылки
  For $i = 1 To 4
    Run($Path & " " & _UIA_ElementGetPropertyValue($aLinks[$i], "ValueValue"))
    If $i < 4 Then Sleep(Random(20, 30, 1) * 1000) ; ожидание от 20 до 30 сек
  Next
  HotKeySet("^{F1}", "Go")
EndFunc
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
ручной вариант.
Спасибо большое - буду пробовать :smile:
Позвольте отложить всё на завтра - у меня время за полночь, и никакой возможности сосредоточится из за усталости .
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток, InnI
У меня есть дополнительная просьба Вам
1. Маловероятно у кого-то, но у меня бывает возникает ситуация, когда веб страница не догрузилась полностью и отдала скрипту не достоверную информацию.
Имхо, причиной служит тот факт что выход в инет у меня идёт через wi fi. А у него, необъяснимо отчего, бывает пинг вырастает до максимальных значений

Реакция скрипта – Окно уведомление: или не найдены ссылки или их меньше положенного. Всё бы ничего, я думаю дай еще раз нажму f1+ cntrl. Но скрипт – не реагирует: ни на этой странице – ни на любой другой.
Решение нашлось только такое – перезапуск скрипта и функционал восстанавливается.
2. Большая просьба добавить возможность закрыть все открытые и просмотренные вкладки открытых гиперссылок, кроме стартовой страницы после открытия последней гиперссылки: по горячей клавише или автоматически через 20 сек
3. Если возможно – не привязывается жестко к дескриптору (если я вообще правильно понял ) того окна браузера, что запускается при старте скрипта. Это даст возможность открывать в Новых окнах какие-то сайты, чтобы исследовать переходы по их гиперссылкам. Т.е. сейчас допускается просмотр только в одном окне.

4. В связи с новым интересом можно ли немного изменить скрипт с ручным вызовом функций?
Адаптировать скрипт (вариант №2) для просмотров видео на youtube:
i. Не в общем списке, а на канале автора
1. некоторые авторы создают отдельные каналы для видео: как тут (случайный пример)
2. другие не делают: как тут (случайный пример), чтобы увидеть все видео приходится отжать кнопку «Uploads»
ii. Запуск видео с канала – чтобы можно было по горячей клавише реализовать: одно отжатие – один переход по ссылке с видео
1. запускать видео не по порядку как в плейлсте а случайным выбором.
iii. Окно сообщение, с учетом количества открытых т.е. просмотренных видео
1. окно поверх других окон
2. окно: прижато к краю экрана в нижнем левом углу: просто чтобы не мешало
3. горячая клавиша – на обнуление счетчика просмотра.

C Уважением, dr.room
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Теперь скрипт работает с текущим активным окном Chrome. Открытая вкладка закрывается перед переходом по следующей ссылке (отправка окну Ctrl+W). Ctrl+F1 теперь работает и после ошибки.
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

HotKeySet("^{F1}", "Go")

; путь к браузеру
$Path = "D:\Portable\GoogleChrome\GoogleChromePortable.exe"
Run($Path & " --force-renderer-accessibility")

While Sleep(1000)
WEnd

Func Go()
  $hWnd = WinWaitActive(" - Google Chrome", "", 1)
  If Not $hWnd Then Return
  $oParent = _UIA_GetElementFromHandle($hWnd)
  If @error Then Return
  HotKeySet("^{F1}")
  ; находим все ссылки на странице
  $aLinks = _UIA_FindAllElements($oParent, "ControlType", $UIA_HyperlinkControlTypeId)
  If @error Then
    MsgBox(0, @ScriptName, "На этой странице ссылки не найдены")
    HotKeySet("^{F1}", "Go")
    Return
  EndIf
  If $aLinks[0] < 4 Then
    MsgBox(0, @ScriptName, "На этой странице меньше четырёх ссылок")
    HotKeySet("^{F1}", "Go")
    Return
  EndIf
  ; открываем четыре ссылки
  For $i = 1 To 4
    Run($Path & " " & _UIA_ElementGetPropertyValue($aLinks[$i], "ValueValue"))
    Sleep(Random(20, 30, 1) * 1000) ; ожидание от 20 до 30 сек
    ControlSend($hWnd, "", "", "^w")
  Next
  HotKeySet("^{F1}", "Go")
EndFunc

По поводу youtube. Нет у меня желания с ним разбираться. Попробуйте оформить отдельную тему - может кто и заинтересуется.
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0

А как можно этот скрипт встроить в другой скрипт, сделав его составной частью другого. :stars:
Предполагается что Chrome будет запущен изначально с параметром
Код:
 --force-renderer-accessibility
через дописывание его в поле Объект ярлыка
Не предполагается использование горячей клавиши для вызова функции просмотра гиперссылок: просто чтобы исследование переходов было автоматически по достижению скриптом этого кода. Естественно, я точно знал бы куда разместить и сколько раз Ваш код - в общем скрипте.
Заранее спасибо
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
автоматически по достижению скриптом этого кода
Вам понадобится путь к браузеру $Path - вставьте в начало другого скрипта.
Скопируйте код функции (от Func до EndFunc) и вставьте его в самый конец другого скрипта. Очистите функцию от ненужных HotKeySet.
Теперь в нужных местах другого скрипта просто пишите имя функции
Код:
; здесь какой-то код
Go() ; вызов и выполнение функции
; дальше опять какой-то код
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
dr.room
автоматически по достижению скриптом этого кода
Вам понадобится путь к браузеру $Path - вставьте в начало другого скрипта.
Скопируйте код функции (от Func до EndFunc) и вставьте его в самый конец другого скрипта. Очистите функцию от ненужных HotKeySet.
Теперь в нужных местах другого скрипта просто пишите имя функции
Код:
; здесь какой-то код
Go() ; вызов и выполнение функции
; дальше опять какой-то код
Вроде всё сделал, но ...не выходит :(
- сменил путь к браузеру
- полностью удалил все HotKeySet
- от Func до EndFunc скопировал.
Вот что вышло (путь к браузеру Ваш - в это варианте)
Код:
$Path = "D:\Portable\GoogleChrome\GoogleChromePortable.exe"

; здесь какой-то код
MsgBox(0, "Проверка 1", "Начнём же")
;~ по идее отжав кнопку ок, должна была запуститься функция Go - но ... не запустилась  :(

Go() ; вызов и выполнение функции

; дальше опять какой-то код
MsgBox(0, "Проверка 2", "Если Вы читаете это сообщение то значит возможно всё ок ?")

#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

Func Go()
  $hWnd = WinWaitActive(" - Google Chrome", "", 1)
  If Not $hWnd Then Return
  $oParent = _UIA_GetElementFromHandle($hWnd)
  If @error Then Return

  ; находим все ссылки на странице
  $aLinks = _UIA_FindAllElements($oParent, "ControlType", $UIA_HyperlinkControlTypeId)
  If @error Then
    MsgBox(0, @ScriptName, "На этой странице ссылки не найдены")

    Return
  EndIf
  If $aLinks[0] < 4 Then
    MsgBox(0, @ScriptName, "На этой странице меньше четырёх ссылок")

    Return
  EndIf
  ; открываем четыре ссылки
  For $i = 1 To 4
    Run($Path & " " & _UIA_ElementGetPropertyValue($aLinks[$i], "ValueValue"))
    Sleep(Random(20, 30, 1) * 1000) ; ожидание от 20 до 30 сек
    ControlSend($hWnd, "", "", "^w")
  Next

EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
должна была запуститься функция Go - но ... не запустилась
Кто вам сказал, что она не запустилась? Она запустилась, подождала одну секунду активное окно браузера и завершилась, не найдя его. А не нашла она его потому, что опцию "WinTitleMatchMode" нужно включать ДО вызова функции. И UDF подключать тоже нужно ДО действий с её функциями
Код:
#include "UIAutomate.au3" ; первая строчка скрипта
Opt("WinTitleMatchMode", 2) ; вторая строчка скрипта
$Path = "D:\Portable\GoogleChrome\GoogleChromePortable.exe" ; третья строчка скрипта
; весь остальной скрипт
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
Она запустилась, подождала одну секунду активное окно браузера и завершилась, не найдя его.
Точно
Как всегда: высший пилотаж, InnI :thumbs_up:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
dr.room
Вот эту строку в самое начало на первую строку попробуйте переставить
Код:
#include "UIAutomate.au3"
 
Верх