1 (изменено: cyber54245, 2015-01-19 22:25:43)

Тема: VBS: Нажать ссылку в браузере

Здравствуйте. Пытаюсь создать скрипт, который открывает сайт в браузере, находит там ссылку с определенными словами и переходит по этой ссылке.
Такой вариант у меня получился:

Set ie = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
ie.Visible = True
ie.Navigate "http://forum.script-coding.com/"

While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "viewtopic.php") > 0 Then
      a.click
  Exit For
  End If
  next

Вроде даже работает на некоторых сайтах, но, мне нужно чтобы нажатие на ссылку происходило не один раз, а на каждой новой странице опять нажимало на ссылку и переходило дальше. Подскажите пожалуйста как это лучше сделать.

Попробовал просто скопировать For Each несколько раз, но на втором шаге застряет:

+ открыть спойлер
Set ie = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
ie.Visible = True
ie.Navigate "http://forum.script-coding.com/"
'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(1, a.href, "viewtopic.php") > 0 Then
      a.click
  Exit For
  End If
  next

'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(1, a.href, "viewtopic.php") > 0 Then
      a.click

  Exit For
  End If
  next

'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(1, a.href, "viewtopic.php") > 0 Then
      a.click
        
  Exit For
  End If
  next

Похоже проблема в не умении выстраивать структуру %) Подскажите пожалуйста, быть может есть более оптимальный вариант, как на примере http://forum.script-coding.com/viewtopi … 533#p88533

Спасибо!

2 (изменено: Flasher, 2015-01-21 02:00:14)

Re: VBS: Нажать ссылку в браузере

URI = "http://forum.script-coding.com/"  ' исходный адрес
Str = "viewtopic.php"  ' искомая подстрока
Slp = 5 ' задержка в секундах между переходами
Cnt = 10 ' максимальное число переходов

Set IE = CreateObject("InternetExplorer.Application")
Dim M(2) : M(0) = 0 : M(1) = Str : M(2) = Slp
IE.Visible = True : OpenURL URI

Sub OpenURL(URL)
  With IE
    .Navigate(URL)
    While .ReadyState <> 4 Or .Busy : WScript.Sleep 50 : Wend
    InPut Str, 1, "искомую часть URL-пути/параметров:", M(1)
    InPut Slp, 2, "число секунд на ожидание:", M(2)
    For Each Link In .Document.Links
      If InStr(Link, Str) And Split(Link, "#")(0) <> Split(URL, "#")(0) Then
      If InStrRev(Link, "/index.php") = 0 And (InStr(Link, "://") Or Left(Link, 4) = "www.") Then
        M(0) = M(0) + 1 : WScript.Sleep Slp * 1000
        Link.Click : If M(0) = Cnt Then Exit Sub
        URL = Link : Test = 1 : Exit For
      End If
      End If
    Next
  End With : If Test Then OpenURL URL
End Sub

Sub InPut(Var, N, Text, Value)
  Header = Space(17) & "Рекурсивный переход по ссылкам в IE"
  Var = InputBox(String(5, vbnewline) & "Введите " & Text, Header, Value)
  If N = 2 And Not IsNumeric(Var) Then Var = M(2) : Exit Sub End If
  If Var <> "" Then M(N) = Var
End Sub

3

Re: VBS: Нажать ссылку в браузере

Flasher спасибо!
Но мне нужно простое действие. Поочередно, открыть сайт в браузере, затем перейти по ссылке с заданой маской. А затем еще раз перейти по следующей ссылке со следующей страницы с той же маской ссылки. И опять/снова Как паук. Но чтобы можно было задать delay между переходами.
А как в Вашем примере повторить действие Click на следующей странице с определенным delay?

Вариант, который писал выше - работает, но делает буквально 2 перехода. И что-то его стопорит.

4

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

Но чтобы можно было задать delay между переходами.

А, ну так в Вашем коде задержи нет, поэтому я думал, что достаточно открывать последнюю возможную страницу. Исправил под новое условие.

5

Re: VBS: Нажать ссылку в браузере

Да, спаибо, но проблема такая же, как и в моем примере.
Как перейти дальше? Вот скрипт открыл браузер по заданной ссылке, затем сделал click по ссылке с заданными параметрами. А как повторить то же действие "click" уже на следующей странице? Как повторить этот click снова и снова на каждой новой странице? Как бы я не пробовал - получаю ошибку: "Требуемый ресурс занят. 800700AA"

6 (изменено: Flasher, 2015-01-15 22:11:41)

Re: VBS: Нажать ссылку в браузере

Увы, у меня нет такой ошибки, и переход происходит до тех пор, пока адрес не совпадёт с предыдущим, в данном случае - 2 раза.

7

Re: VBS: Нажать ссылку в браузере

У меня такая ошибка, когда я прописываю click еще раз в скрипте, как в моем примере под спойлером. Попробовал Ваш скрипт в исходном варианте на другом сайте, и всё равно стопорится на втором переходе по ссылке, хотя ссылки ведут дальше.

А возможно ли как нибудь просто вписать этот click несколько раз, чтобы просто исполнилась инструкция. Быть может оно стопорится из-за "For Each"?

8

Re: VBS: Нажать ссылку в браузере

Лучше напишите ваши значения переменных URI и Str. Я посмотрю.

9

Re: VBS: Нажать ссылку в браузере

Вот к примеру:
URI = "http://www.visualbasicscript.com/"
Str = ".aspx"

10

Re: VBS: Нажать ссылку в браузере

Скажите пожалуйста, почему не работает так?

Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://www.visualbasicscript.com/"
'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend


For Each a In ie.document.getElementsByTagName("a")
  If InStr(1, a.href, ".aspx") > 0 Then
    a.click
    While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
    a.click
    While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
    a.click
    While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
    a.click
    Exit For
  End If
Next

Мне не важно, чтобы было красиво. Главное - чтобы просто. Плюс, переходить по ссылкам нужно не бесконечно. Около 10-ти переходов будет достаточно.

11 (изменено: Flasher, 2015-01-16 04:09:31)

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

Str = ".aspx"

Недостаточно входных данных для правильного поиска. Первым попадается "/calendar.aspx" и браузер автоматически подставляет "http://", получается ерунда с несуществующим адресом, тройным слэшем, и переход зацикливается. Добавил проверку на предмет "://".

cyber54245 пишет:

Скажите пожалуйста, почему не работает так?

Потому что нет навигации к последующей ссылке методом Navigate, + то, о чём я писал выше.

cyber54245 пишет:

Главное - чтобы просто.

Мой пример как раз проще.

Около 10-ти переходов будет достаточно.

Добавил опцию.

12

Re: VBS: Нажать ссылку в браузере

Большое спасибо, Вы просто удивляете меня своими умениями

Но всё равно продолжаются некоторые проблемы. Если взять эти параметры:
URI = "http://forum.script-coding.com/"
Str = "viewtopic.php"
, то переходы не происходят.

А Вы можете подсказать, возможно ли вообще прописать "столбиком" пошагово действия, чтобы скрипт их выполнял. Вот прям в таком же алгоритме: 1. Открыть страницу, 2. Найти, нажать на ссылку, 3. Подождать, 4. Найти, нажать на ссылку, 5. Подождать, 6. Найти, нажать на ссылку, 7. Подождать и т.д.
Чтобы я вручную просто вписал маску ссылки на каждой странице, и так же вручную написал delay перед каждым переходом.

Пробовал что-то на подобие:

Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://www.example.com/"
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
  If InStr(a.href, searchString & ".html") > 0 Then
    url = a.href
    Exit For
  End If
Next

ie.Navigate url
WScript.Sleep 2214

ie.Navigate url
WScript.Sleep 3511

ie.Navigate url
WScript.Sleep 2140

Но, мне очень важно, чтобы вместо ie.Navigate было именно click. И тут я не знаю как его организовать

13

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

то переходы не происходят.
Чтобы я вручную просто вписал маску ссылки на каждой странице, и так же вручную написал delay перед каждым переходом.

Посмотрите нынешний вариант.

cyber54245 пишет:

Но, мне очень важно, чтобы вместо ie.Navigate было именно click.

Это невозможно по определению.

14

Re: VBS: Нажать ссылку в браузере

Очень круто
Спасибо!

А сложно ли будет этот же скрипт, но только без Inputbox сделать? Чтобы все эти данные уже изначально были указаны в скрипте и просто повторялись через определенные WScript.Sleep? Возможно ли этот же скрипт без всплывающих окон сделать?

15 (изменено: Flasher, 2015-01-19 09:41:01)

Re: VBS: Нажать ссылку в браузере

Конечно, возможно, это ещё проще.

URI = "http://forum.script-coding.com/"  ' исходный адрес
Sec = 1  ' максимальное число секунд на проверку загрузки страницы
' массив с искомыми подстроками и секундами на ожидание после пробела:
Arr = Array("viewtopic 3", "register.php 2", "rules.html 2")

Set IE = CreateObject("InternetExplorer.Application")
Dim M(0) : M(0) = 0 : IE.Visible = True : OpenURL URI

Sub OpenURL(URL)
  IE.Navigate(URL) : T = Timer
  Do : WScript.Sleep 50 : If Timer - T > Sec Then Exit Do
  Loop Until Not IE.Busy And IE.ReadyState = 4
  For Each Link In IE.Document.Links
    If InStr(Link, Split(Arr(M(0)))(0)) And Split(Link, "#")(0) <> Split(URL, "#")(0) Then
    If InStrRev(Link, "/index.php") = 0 And (InStr(Link, "://") Or Left(Link, 4) = "www.") Then
      WScript.Sleep Split(Arr(M(0)))(1) * 1000
      Link.Click : If M(0) = UBound(Arr) Then Exit Sub
      M(0) = M(0) + 1 : URL = Link : Test = 1 : Exit For
    End If
    End If
  Next : If Test Then OpenURL URL
End Sub

16

Re: VBS: Нажать ссылку в браузере

Да, всё отлично выглядит, но происходит всего один переход по найденной ссылке и опять стопорится.
Использовал вот такие данные:

URI = "http://forum.script-coding.com"  ' исходный адрес
Str = Array("viewtopic", "register.php", "rules.html")  ' массив с искомыми подстроками
Slp = Array(3, 2, 2)  ' массив с секундами ожидания

Быть может проблема в том, что типо объект занят? Однажды такая ошибка выпала.

The requested resource is busy. 800700AA

Может какой нибудь: Set ie = Nothing должно помочь?
Типо из-за того, что в том же окне происходит действие.

17 (изменено: Flasher, 2015-01-19 05:30:46)

Re: VBS: Нажать ссылку в браузере

cyber54245, изменил условия, пробуйте.

Но если форум виснет, как это тут периодически случается, то какие тут могут быть переходы?
В сообщении дословно и пишется, что ресурс занят.

18

Re: VBS: Нажать ссылку в браузере

Та в том то и дело, что на любом сайте такое происходит, даже если delay больше выставить. Всю голову уже обдумал, никак не пойму в чем дело %)

19 (изменено: Flasher, 2015-01-19 06:49:07)

Re: VBS: Нажать ссылку в браузере

cyber54245
А если убить процесс iexplore.exe и после запустить?
Delay? Нужно Sec менять, а не ожидание на просмотр (оно тут роли никакой не играет).

20

Re: VBS: Нажать ссылку в браузере

Да, вот эту Sec и имел ввиду под видом delay.
Так если убить процесс, то вся цепочка переходов закончится не успев начаться

21

Re: VBS: Нажать ссылку в браузере

Это почему? если убить ... и после запустить скрипт - последовательность ясна?

22 (изменено: cyber54245, 2015-01-20 02:15:03)

Re: VBS: Нажать ссылку в браузере

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

+ открыть спойлер
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://www.example.com/"
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, ".html") > 0 Then
    url = a.href
    Exit For
  End If
Next

ie.Navigate url
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

Но здесь мне не подходит способ ie.Navigate url. Потому, что нужно, чтобы передавался referer при переходе по ссылке. А при ie.Navigate url этого не происходит, потому что он просто заново загружает ссылку. Я же придумал для передачи referer использовать a.focus : WshShell.SendKeys "{ENTER}". По этому сделал такой вариант:

+ открыть спойлер
Set ie = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
ie.Visible = True
ie.Navigate "https://site.com/"
'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
      a.focus
      WshShell.SendKeys "{ENTER}"
    Exit For
  End If

Всё сработало и точно как нужно. Но, осталась вторая задача... После того, как перешел по ссылке, нужно заново найти ссылку по той же "маске" и снова перейти по ней. Чтобы упростить, давайте вместо a.focus : WshShell.SendKeys "{ENTER}" использовать a.Click. Я потом под себя исправлю.

Вот и не могу придумать, каким образом просто повторить это действие .click снова и снова на каждой новой странице. Пробовал просто несколько раз повторить For Each, но ничего не происходило. Дальше второго перехода по ссылке скрипт застывал без ошибок.

+ открыть спойлер
Set ie = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
ie.Visible = True
ie.Navigate "https://site.com/"
'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
      a.focus
      WshShell.SendKeys "{ENTER}"
    Exit For
  End If
next
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
      a.focus
      WshShell.SendKeys "{ENTER}"
    Exit For
  End If
next
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
      a.focus
      WshShell.SendKeys "{ENTER}"
    Exit For
  End If
next

Но здесь, похоже я просто еще очень глупый и не особо разбираюсь в структуре VBS. По этому сделал всё хоть и логично, но похабно Если бы подобный вариант сработал - меня бы это устроило просто идеально!

Далее начали появляться версии, почему не работает. К примеру:

+ открыть спойлер
When using the Click method your handle to the IE instance gets messed up for some reason. You could try to re-attach to the window with something like this: 

Set app = CreateObject("Shell.Application")
For Each wnd In app.Windows
  If InStr(1, wnd.FullName, "iexplore.exe", vbTextCompare) > 0 Then
    Set ie = wnd
    Exit For
  End If
Next

Далее, Flasher показал самый оптимизированный вариант:

+ открыть спойлер
URI = "http://forum.script-coding.com/"  ' исходный адрес
Sec = 1  ' максимальное число секунд на проверку загрузки страницы
' массив с искомыми подстроками и секундами на ожидание после пробела:
Arr = Array("viewtopic 3", "register.php 2", "rules.html 2")

Set IE = CreateObject("InternetExplorer.Application")
Dim M(0) : M(0) = 0 : IE.Visible = True : OpenURL URI

Sub OpenURL(URL)
  IE.Navigate(URL) : T = Timer
  Do : WScript.Sleep 50 : If Timer - T > Sec Then Exit Do
  Loop Until Not IE.Busy And IE.ReadyState = 4
  For Each Link In IE.Document.Links
    If InStr(Link, Split(Arr(M(0)))(0)) And Split(Link, "#")(0) <> Split(URL, "#")(0) Then
    If InStrRev(Link, "/index.php") = 0 And (InStr(Link, "://") Or Left(Link, 4) = "www.") Then
      WScript.Sleep Split(Arr(M(0)))(1) * 1000
      Link.Click : If M(0) = UBound(Arr) Then Exit Sub
      M(0) = M(0) + 1 : URL = Link : Test = 1 : Exit For
    End If
    End If
  Next : If Test Then OpenURL URL
End Sub

Но здесь скрипт при любых обстоятельствах(любые сайты, ссылки, и время ожидания) показывал одну и ту же ошибку сразу перед вторым переходом по ссылке. И дальше ничего не происходило.

Требуемый ресурс занят. 800700AA

Самый простой вариант, как мне показалось, предложил omegastripes:

+ открыть спойлер
Dim strUrl, oIE, oTag
strUrl = "http://forum.script-coding.com/"

Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 5000

For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, ".php") > 0 Then
        oTag.Click
        Do While Rnd < .9
            WScript.Sleep 100 + Rnd * 2000
            oTag.Click
        Loop        
        Exit For
    End If
Next

Отличается от всех тем, что действие .click помещено в Loop. С рандомным ожиданием между переходами. И вариант очень простой. Просто идеально! Ведь я запросто смогу его переделать под свои нужды с определенными сайтами и дополнительными действиями. НО! После первого перехода по ссылке опять получаю ошибку:

Разрешение отклонено: 'Click'. 800A0046

Мне подойдет даже самый примитивный вариант, который просто сработает. Даже если там просто повторяющиеся строчки. "Красота" кода не имеет значения. Просто хочу открыть сайт, найти ссылку, и клацать её на каждой странице куда заведет Быть может как-то можно заключить .click в переменную а потом её применять "снаружи" For each, как в варианте с .Navigate url? Уже всю голову поломал)) Просто не хватает знаний. VBS для меня не очень знаком. Но у новичков всегда так, главное амбиции поддерживать
Огромное спасибо за вашу помощь!

23

Re: VBS: Нажать ссылку в браузере

cyber54245, добавьте префикс скриптового языка в названии темы.

24

Re: VBS: Нажать ссылку в браузере

omegastripes пишет:

Соберите всё, что у Вас накопилось на данный момент, опубликуйте код скрипта(-ов), опишите что работает не так, какие вываливаются ошибки.

По-моему, это грубая ошибка публиковать все коды, которые можно легко заменить ссылками постов. Или у кого-то тут есть желание наблюдать и читать полотенца?

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

25

Re: VBS: Нажать ссылку в браузере

Убивал процесс, затем запускал код - результат тот же. Требуемый ресурс занят, 800700AA.

26

Re: VBS: Нажать ссылку в браузере

cyber54245
А первый мой вариант отрабатывает без этой ошибки?

27

Re: VBS: Нажать ссылку в браузере

Тоже с ошибкой. Делает 1-2 перехода и потом: "Требуемый ресурс занят, 800700AA".
Это если этот вариант:
http://forum.script-coding.com/viewtopi … 529#p90529

28

Re: VBS: Нажать ссылку в браузере

Мда. Можно, конечно, рискнуть убрать "And .Busy", но этот вариант тоже не айс.
А вообще система и IE каких версий? Скорость подключения интернета?

29

Re: VBS: Нажать ссылку в браузере

IE версия - 11.09600.17501
Windows 7 Ultimate 64
Интернет безлимитный без ограничения скорости 100mb/s (~4-5mb/s)

Так а у Вас нормально переходит без всяких ошибок и делает все 10 переходов по ссылкам?

30

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

Тоже с ошибкой. Делает 1-2 перехода и потом: "Требуемый ресурс занят, 800700AA".
Это если этот вариант:
http://forum.script-coding.com/viewtopi … 529#p90529

В коде по ссылке выше строка

While .ReadyState <> 4 And .Busy : WScript.Sleep 50 : Wend

на мой взгляд, должна выглядеть так:

While .ReadyState <> 4 Or .Busy : WScript.Sleep 50 : Wend
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

31

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

Так а у Вас нормально переходит без всяких ошибок и делает все 10 переходов по ссылкам?

Да. Могу записать скринкаст, если не верите. У меня Win7x32, IE 11.00.9431.

omegastripes пишет:

на мой взгляд, должна выглядеть так:

Не вижу логики в Or. А вообще на форуме (да и в сети) хватает примеров с этой проверкой.

32

Re: VBS: Нажать ссылку в браузере

Не вижу логики в Or.

Потому что в оригинале было:

    Do 
        WScript.Sleep 100
    Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

Когда данное условие преобразуется в «While», происходит следующее:

https://upload.wikimedia.org/math/4/9/8/4988c1393d471a33a5544a819d6afe7f.png

33

Re: VBS: Нажать ссылку в браузере

Потому что в оригинале было:

Что есть оригинал? См. второй вариант. Оба рабочие.

34

Re: VBS: Нажать ссылку в браузере

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

Do Until .ReadyState = 4 And Not .Busy
    WScript.Sleep 100
Loop
Do While .ReadyState <> 4 Or .Busy
    WScript.Sleep 100
Loop
While .ReadyState <> 4 Or .Busy
    WScript.Sleep 100
Wend

В Вашем же примере данное условие

While .ReadyState <> 4 And .Busy

завершит цикл, например, когда страница загрузится полностью, не смотря на то, что IE занят, либо при недогруженной странице в случае даже кратковременного появления состояния "не занят". Что потенциально может привести к ошибкам при дальнейшем выполнении кода. Просто попробуйте описать алгоритм словами, и все прояснится. Именно такие моменты приводят к нестабильности программы, когда на одном ПК работает, а на другом - нет.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

35

Re: VBS: Нажать ссылку в браузере

omegastripes
Пожалуй, в отношении Or Вы правы. 1 And 0 или 0 And 1 возвращают 0. Хотя у Xameleon не так давно проскакивало.
А вот что касаемо нестабильности, ещё раз повторюсь, см. второй вариант. Там используется как раз цикл, который привёл alexii. И именно с него начались жалобы на .Busy.

36 (изменено: omegastripes, 2015-01-21 01:27:37)

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

Тоже с ошибкой. Делает 1-2 перехода и потом: "Требуемый ресурс занят, 800700AA".
Это если этот вариант:
http://forum.script-coding.com/viewtopi … 529#p90529

cyber54245, попробуйте отдебажить: перед строкой, в которой происходит ошибка добавьте строку

msgbox typename(ie) & ", " & typename(link)

Какие типы объектов будут выведены? А лучше использовать полноценный дебаггер, например, если установлен Microsoft Script Editor, можно запустить скрипт c опцией //x, для Win7 x64 так

c:\windows\syswow64\wscript.exe //x c:\test.vbs

Либо воспользоваться Primal Script 2012 или VbsEdit. Поставив breakpoint, по типам объектов ie и link можно увидеть, не "отвалился" ли IE - в том случае тип объекта в переменной ie изменится c IWebBrowser2 на Object.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

37

Re: VBS: Нажать ссылку в браузере

omegastripes
Только надо разбирать второй вариант. Именно он выполняет конечную задачу.

38

Re: VBS: Нажать ссылку в браузере

НЕ ПОВЕРИТЕ!
Добавил:

msgbox typename(ie) & ", " & typename(link)

В этом коде:

+ открыть спойлер
URI = "http://forum.script-coding.com/"  ' исходный адрес
Sec = 5  ' максимальное число секунд на проверку загрузки страницы
' массив с искомыми подстроками и секундами (после пробела) на ожидание:
Arr = Array("viewtopic 3", "register.php 2", "rules.html 2")

Set IE = CreateObject("InternetExplorer.Application")
Dim M(0) : M(0) = 0 : IE.Visible = True : OpenURL URI

Sub OpenURL(URL)
  With IE
    .Navigate(URL) : T = Timer
    Do : WScript.Sleep 50 : If Timer - T > Sec Then Exit Do
    Loop Until Not .Busy And .ReadyState = 4
    For Each Link In .Document.Links
      If InStr(Link, Split(Arr(M(0)))(0)) And Split(Link, "#")(0) <> Split(URL, "#")(0) Then
      If InStrRev(Link, "/index.php") = 0 And (InStr(Link, "://") Or Left(Link, 4) = "www.") Then
        WScript.Sleep Split(Arr(M(0)))(1) * 1000
        msgbox typename(ie) & ", " & typename(link)
        Link.Click : If M(0) = UBound(Arr) Then Exit Sub
        M(0) = M(0) + 1 : URL = Link : Test = 1 : Exit For
      End If
      End If
    Next
  End With : If Test Then OpenURL URL
End Sub

И всё заработало!!! Каждый раз перед переходом по ссылке выскакивает msgbox:

IWebBrowser2, HTMLAnchorElement

И переходы происходят. Если убрать msgbox, то опять ошибка "Требуемый ресурс занят, 800700AA". Вот теперь интересно почему такое происходит И чем лучше заменить msgbox, чтобы переходы всё же происходили)

39 (изменено: Flasher, 2015-01-21 15:24:29)

Re: VBS: Нажать ссылку в браузере

cyber54245, у меня ещё одна мысль была насчёт всяких  BHO, которые могут создать проблемы.
Если вместо этой строки добавить IE.Stop , ситуация изменится?

40 (изменено: omegastripes, 2015-01-21 15:11:59)

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

...И чем лучше заменить msgbox, чтобы переходы всё же происходили)

Попробуйте на время отключить скрипты и активное содержимое в настройках IE, и убрать тот msgbox.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

41 (изменено: cyber54245, 2015-01-21 15:45:31)

Re: VBS: Нажать ссылку в браузере

IE.Stop не помогло ни перед, ни после Click. Та же ошибка после второго перехода.
Отключить активные сценарии, тоже не помогло. Так же пробовал выставлять разные уровни безопасности и конфиденциальности. Результат одинаков, одна и та же ошибка.

Перед каждым тестом очищаю все данные браузера(ctrl+shift+Del).

42

Re: VBS: Нажать ссылку в браузере

cyber54245, предлагаю попробовать заменить

Link.Click

кодом с местной анастезией:

On Error Resume Next
Do
    WScript.Sleep 500
    Err.Clear
    Link.Click
Loop Until Err.Number = 0
On Error Goto 0
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

43

Re: VBS: Нажать ссылку в браузере

Та же ошибка. Просто вместо Link.Click в скрипте как выше вставил Ваш код. И снова та же ошибка: Требуемый ресурс занят. Странно почему при MsgBox всё работает и никаких ошибок не появляется. Быть может как-то сымитировать этот msgbox можно да и хрен с ним?))

44

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

... вставил Ваш код. И снова та же ошибка: Требуемый ресурс занят. ...

То есть, выходит, ошибка возникает в режиме On Error Resume Next? =8-0

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

45 (изменено: cyber54245, 2015-01-21 22:31:01)

Re: VBS: Нажать ссылку в браузере

Да, даже при On Error Resume Next возникает ошибка: Требуемый ресурс занят.
Делает один переход по ссылке, и потом ошибка. На некоторых сайтах успевает два раза перейти.
Вот код:

+ открыть спойлер
URI = "http://forum.script-coding.com/"  ' исходный адрес
Sec = 1  ' максимальное число секунд на проверку загрузки страницы
' массив с искомыми подстроками и секундами на ожидание после пробела:
Arr = Array("viewtopic 3", "register.php 2", "rules.html 2")


Set IE = CreateObject("InternetExplorer.Application")
Dim M(0) : M(0) = 0 : IE.Visible = True : OpenURL URI


Sub OpenURL(URL)
  With IE
    .Navigate(URL) : T = Timer
    Do : WScript.Sleep 50 : If Timer - T > Sec Then Exit Do
    Loop Until Not .Busy And .ReadyState = 4
    For Each Link In .Document.Links
      If InStr(Link, Split(Arr(M(0)))(0)) And Split(Link, "#")(0) <> Split(URL, "#")(0) Then
      If InStrRev(Link, "/index.php") = 0 And (InStr(Link, "://") Or Left(Link, 4) = "www.") Then
        WScript.Sleep Split(Arr(M(0)))(1) * 1000
        On Error Resume Next
Do
    WScript.Sleep 500
    Err.Clear
    Link.Click
Loop Until Err.Number = 0
On Error Goto 0 
If M(0) = UBound(Arr) Then Exit Sub
        M(0) = M(0) + 1 : URL = Link : Test = 1 : Exit For
      End If
      End If
    Next
  End With : If Test Then OpenURL URL
End Sub

46

Re: VBS: Нажать ссылку в браузере

Вы, наверное, будете удивлены, но после того, как я вчера обновил джаву, у меня те же свистопляски начались. http://smiles.kolobok.us/user/Cherna_20.gif

47

Re: VBS: Нажать ссылку в браузере

У меня код из http://forum.script-coding.com/viewtopi … 854#p90854 отрабатывает без ошибок. Джаву пока не обновлял . Но подобное поведение IE (с аналогичными ошибками) встречал и ранее.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

48

Re: VBS: Нажать ссылку в браузере

Вы не знаете как сымитировать msgbox уже в таком случае?
Или вообще как-то упростить код до примитивности %)

49 (изменено: omegastripes, 2015-01-23 01:19:14)

Re: VBS: Нажать ссылку в браузере

cyber54245 пишет:

Вы не знаете как сымитировать msgbox уже в таком случае?...

Единственное, что приходит на ум - заменить msgbox на .popup с секундной выдержкой, чтобы не нужно было каждый раз вручную жать. Однако замечу, что это чудовищный костыль.
Есть ощущение, что вызываются какие-то скрипты на странице, по событию перехода фокуса (стоит проверить event listeners на странице). Может быть стоит его (фокус) вручную снять с окна IE и вновь вернуть?
Так же можно пойти немного другим путем: добавить в DOM страницы скрипт, который сам находил бы нужную ссылку на странице и вызывал метод .click, не снаружи IE, а "изнутри". Вероятно, при таком обращении подобные ошибки удастся избежать. Но нужно определить условия, при которых данный скрипт должен активироваться.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

50

Re: VBS: Нажать ссылку в браузере

Заметил, что с msgbox "", , "" отлично работает и этот вариант скрипта:

+ открыть спойлер
Dim strUrl, oIE, oTag
strUrl = "http://forum.script-coding.com/"
Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 3000

For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, "viewforum.php?id=25") > 0 Then
        msgbox "", , ""
        oTag.Click 
        Exit For
    End If
Next
WScript.Sleep 5000

For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, "viewtopic.php?id=7") > 0 Then
        msgbox "", , ""
        oTag.Click 
        Exit For
    End If
Next
WScript.Sleep 5000

For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, "profile.php?id=2") > 0 Then
        msgbox "", , ""
        oTag.Click 
        Exit For
    End If
Next
WScript.Sleep 5000

For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, "misc.php?action=rules") > 0 Then
        msgbox "", , ""
        oTag.Click 
        Exit For
    End If
Next

А такой вид мне подходит на много больше. Чтобы между поиском ссылок я мог задействовать другие функции и лепить всё как будет нужно Но опять же, без msgbox не работает. Как же его блин заставить работать))

51

Re: VBS: Нажать ссылку в браузере

ХАХА!!! Вы не поверите!!!

Решил проблему! Если можно так выразиться)

Запускаю этот же скрипт из предыдущего моего сообщения. И просто открываю другое окно любого приложения. Так сказать, убираю фокус с окна IE. И что вы думаете? Скрипт спокойно себе исполняется без каких либо ошибок

А что же тогда сделать, чтобы автоматически расфокусировать окно?

52

Re: VBS: Нажать ссылку в браузере

А я просто откатился до 7-й джавы, и у меня мои исходники опять заработали. http://smiles.kolobok.us/mini/pardon_mini.gif
Вывод, 6.1.7600.16385 - зло. В сборке идут 3 сетевых модуля, они, видимо, и гадят.
Возможно, и при установке последнего IE та же схема.

53

Re: VBS: Нажать ссылку в браузере

Кто нибудь подскажет как сделать действие обратное app.activate?

54

Re: VBS: Нажать ссылку в браузере

cyber54245
Стандартными средствами никак. Либо, как выше предлагалось, вызывать WSH.PopUp "", 0.6, "".

Но сразу хочу отметить, что это исключительно частное решение в стационарных условиях, и у меня, к примеру, проблема лежала исключительно в плоскости доступа ресурса на 2-й попытке перейти по ссылке. Т.е. никакая дефокусировка окна, с которой я практически начинал тесты, к положительному результату не приводила.
Тоже много чего пробовал отключать, настраивать опции - бесполезно. Только откат помог.

А какое поведение будет в случае ухода с рабочего поля, допустим, на адресную строку?

55

Re: VBS: Нажать ссылку в браузере

Спасибо за столь подробный ответ.
Если в адресную строку перевести курсор - всё равно не срабатывает переход по ссылке.
А как сделать, к примеру AppActivate("Explorer")? Пробовал это название - не сработало. Быть может есть какой нибудь стандартный процесс, на который можно перевести фокусировку?

56 (изменено: Flasher, 2015-01-26 07:18:28)

Re: VBS: Нажать ссылку в браузере

Для этого нужно узнать его PID, тут без WMI не обойдётся.
Предлагаю переводить фокус в область уведомлений (со своим путём к nircmd, разумеется):

CreateObject("WScript.Shell").Run """C:\Моя папка\nircmd\nircmd.exe"" sendkeypress lwin+b"

Либо вызывать и убирать меню "Пуск"

CreateObject("WScript.Shell").SendKeys("^{ESC}{ESC}")