【问题标题】:Javascript link doesn't respond in selenium excel vbaJavascript链接在selenium excel vba中没有响应
【发布时间】:2019-05-23 00:35:58
【问题描述】:

我正在尝试做这样一个点击 javascript 链接的行

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

这一行没有任何错误,但有时它不起作用..我说有时并不总是..有时工作,有时停止,我不知道原因 我必须重新启动代码才能启动新的机器人(驱动程序),在某些情况下我必须重新启动很多次,直到这个链接工作

这是这个 javascript 链接的 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>

我怎样才能使这个链接工作......或者是否有解决方法让它工作......? 我试图解决这一点,但我根本没有找到任何线索

这是响应式的 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'"

这是网络快照(可能有用)>> 我看到 302(我认为应该有更新的缓存..)那么有没有办法清除机器人的缓存?

【问题讨论】:

    标签: javascript excel vba selenium-webdriver web-scraping


    【解决方案1】:

    在顶部尝试以下操作

     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','');"
    

    清除缓存并返回(因为按钮位于 shadow-root 中,您需要使用 /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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2015-10-20
    • 2020-07-09
    相关资源
    最近更新 更多