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
Щт Уккщк Куыгьу Туче

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 занят, либо при недогруженной странице в случае даже кратковременного появления состояния "не занят". Что потенциально может привести к ошибкам при дальнейшем выполнении кода. Просто попробуйте описать алгоритм словами, и все прояснится. Именно такие моменты приводят к нестабильности программы, когда на одном ПК работает, а на другом - нет.

Щт Уккщк Куыгьу Туче

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.

Щт Уккщк Куыгьу Туче

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.

Щт Уккщк Куыгьу Туче

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
Щт Уккщк Куыгьу Туче

43

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

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

44

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

cyber54245 пишет:

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

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

Щт Уккщк Куыгьу Туче

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 (с аналогичными ошибками) встречал и ранее.

Щт Уккщк Куыгьу Туче

48

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

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

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

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

cyber54245 пишет:

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

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

Щт Уккщк Куыгьу Туче

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 не работает. Как же его блин заставить работать))