Javascript ссылка не отвечает в Selen Excel VBA - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь сделать такую ​​строку, которая нажимает на ссылку javascript

.FindElementById("ctl00_ContentPlaceHolder1_LinkButton4").WaitDisplayed(True, 3000).Click

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

Вот часть HTMLэтой ссылки javascript

<a id="ctl00_ContentPlaceHolder1_LinkButton4" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$LinkButton4','')" style="display:inline-block;width:280px;text-decoration:none;height:22px;font-weight:bold;font-size:11pt;color:Maroon;border-width:1px;border-style:Dashed;border-color:#404040;background-color:#FFFFC0;vertical-align: middle; text-align: center; cursor: hand;">Some Text Removed For Privacy</a>

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

Это HTML-часть для адаптивной (я не вижу никакой разницы)

<a id="ctl00_ContentPlaceHolder1_LinkButton4" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$LinkButton4','')" style="display:inline-block;width:280px;text-decoration:none;height:22px;font-weight:bold;font-size:11pt;color:Maroon;border-width:1px;border-style:Dashed;border-color:#404040;background-color:#FFFFC0;vertical-align: middle; text-align: center; cursor: hand;">Some Text Removed For Privacy/a>

Вот снимок ошибки после выполнения этой строки

.ExecuteScript "javascript:__doPostBack('ctl00$ContentPlaceHolder1$LinkButton4'"

enter image description here

Thisтакое снимок сети (может быть полезным) >> Я вижу 302 (который, я думаю, должен быть более новый кеш ..), так есть ли способ очистить кэш бота?enter image description here

1 Ответ

0 голосов
/ 23 декабря 2018

Попробуйте следующее сверху

 Const JS_WAIT_CLICKABLE = _
    "var target = this, endtime = Date.now() + arguments[0];" & _
    "(function check_clickable() {" & _
    "  var r = target.getBoundingClientRect(), x = r.left+r.width/2, y = r.top+r.height/2;" & _
    "  for (var e = document.elementFromPoint(x , y); e; e = e.parentElement)" & _
    "    if (e === target){ callback(target); return; }" & _
    "  if (Date.now() > endtime) { callback(target); return; }" & _
    "  setTimeout(check_clickable, 60);" & _
    "})();"                                      'by @florentbr

Затем

With .FindElementById("ctl00_ContentPlaceHolder1_LinkButton4")
    .ExecuteAsyncScript(JS_WAIT_CLICKABLE, 10000) _
    .Click
End With

Вы также можете попробовать выполнить прямое

.ExecuteScript "javascript:__doPostBack('ctl00$ContentPlaceHolder1$LinkButton4','');"

Очистить кеш и перейти назад (поскольку кнопка находится в теневом корне, вам нужно использовать /deep/ комбинатор)

d.get "chrome://settings/clearBrowserData"
Dim button As Object
d.FindElementByCss("* /deep/ #clearBrowsingDataConfirm").Click
Set button = d.FindElementByCss("* /deep/ #clearBrowsingDataConfirm")

Const MAX_WAIT_SEC As Long = 15
Dim t As Date
t = Timer
Do
    DoEvents
    If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop Until button Is Nothing

d.ExecuteScript "window.history.go(-2);"

Или, возможно,

d.GoBack
...