【问题标题】:Click OK in popup using Selenium VBA使用 Selenium VBA 在弹出窗口中单击确定
【发布时间】:2020-11-06 09:09:17
【问题描述】:

尝试自动化在线订单流程。订单规格完成后,您按下保存按钮。如果项目规格(高度)>1000mm,则会显示一个弹出窗口。我在自动单击它时遇到问题。它不在 iframe 中。

在下面的第二行代码中: bot.FindElementById("ctl00_mainContent_ucOrderDetailBlind_btnSave").Click

“如果 >1000mm 条件为 TRUE,则单击“导致”弹出警告。它只有一个按钮 - 'OK'(编码为 nbsp;OKnbsp; )。手动单击允许自动进度转到下一页,但我需要帮助才能使编码自动执行此操作。目前,代码似乎已挂起,显示弹出窗口。 Debug表示下一条指令无法执行——显然是因为那个findElementById..Click找不到,因为进程卡住了。

我已经尝试了几种替代方案 - 请查看我尝试过的最有可能的代码。

If ThisWorkbook.Sheets("SquareSpace").Cells(r, "F").Value > 1000 Then ' The item is more than 1000mm high

bot.FindElementById("ctl00_mainContent_ucOrderDetailBlind_btnSave").Click 
                            
'Alternative 1
bot.FindElementByXPath("//input[@ID='popup_ok' and text()=' OK ']").Click

'Alternative 2
bot.SwitchToAlert.Accept
bot.Wait 1000

Alternative 3
bot.FindElementById("popup_ok").Click

Else ' for when the item is not more than 1000mm high

       bot.FindElementById("ctl00_mainContent_ucOrderDetailBlind_btnSave").Click
       bot.Wait 500

End If

'Then the next instruction of the form bot.FindElementById ......Click

为了清晰起见删除了一些内容的 HTML(文本和样式):

<div id="popup_container" class="ui-draggable" style="position: absolute; z-index: 99999; padding: 0px; margin: 0px; min-width: 604px; max-width: 604px; top: 0px; left: 647.5px;"><h1>Warning</h1>
    
    <div id="popup_content" class="alert">

        <div id="popup_message"><br>WARNING TEXT</div>

        <div id="popup_panel"><input type="button" value="&nbsp;OK&nbsp;" id="popup_ok"></div>

    </div>
</div>

感谢任何建议。谢谢。

【问题讨论】:

    标签: vba selenium xpath css-selectors popupwindow


    【解决方案1】:

    要单击 valueOK 的元素,您可以使用以下任一Locator Strategies

    • 使用FindElementByCss()

      bot.Wait 5000
      bot.FindElementByCss("div#popup_container div#popup_panel > input#popup_ok").Click
      
    • 使用FindElementByXPath()

      bot.Wait 5000
      bot.FindElementByXPath("//div[@id='popup_container']//div[@id='popup_panel']/input[@id='popup_ok']").Click
      

    【讨论】:

    • 我尝试同时使用 Css 和 XPath 方法,也尝试过:bot.FindElementByXPath("//div[@id='popup_container']//div[@id='popup_content']//div[@id='popup_panel']/input[@id='popup_ok']").Click 不确定语法是否正确 - 但它不起作用。当它疲于执行下一条指令时会发生错误,因此我得出结论它没有离开页面。感谢您提供更多想法
    • 谢谢。一旦我解决了另一个问题,这个解决方案就起作用了
    【解决方案2】:

    尝试使用javascript点击按钮:

    [编辑 - 更新的标识符]

    element=bot.FindElementByXPath("//input[@id='popup_ok']")
    x =bot.ExcuteScript("arguments[0].click();", element)
    

    [以上代码已更新 - 见 cmets] [以下新] 让它按预期工作很有趣。

    这是我的小测试功能,让您了解我用来检查的东西:

    Function selenium()
        Dim driver As New WebDriver
        Dim element As WebElement
        
        driver.Start "chrome"
        driver.Get "https://www.google.co.uk"
        driver.FindElementByXPath("//input[@name='q']").SendKeys "hello world"
        Set element = driver.FindElementByXPath("//input[@value='Google Search']")
        
        x = driver.ExecuteScript("arguments[0].click();", element)
    End Function
    

    不知道为什么我必须从执行脚本中分配一个响应,但没有它就无法工作。

    【讨论】:

    • 谢谢,抱歉,我无法转换为 Selenium VBA 语法
    • 别担心,伙计。等我上线再看看:-)
    • 嗨 Rich,谢谢。我用这些Set element = bot.FindElementById("ctl00_mainContent_ucOrderDetailBlind_btnSave") X = bot.ExecuteScript("arguments[0].click();", element) 替换了这行bot.FindElementById("ctl00_mainContent_ucOrderDetailBlind_btnSave").Click 。什么样的变量是'X'?当它试图找到一个不存在的元素时,例程会停止 - 所以我猜它没有关闭弹出窗口
    • 我无法告诉你 x 是什么 - 如果不分配返回变量,它就不会为我运行。如果它在寻找对象时停滞不前,请尝试花药标识符? - 尝试通用 xpath,例如 //input[@id='popup_ok']
    • 我现在看到我借用了你现有的 findby id,它不在你的按钮的 html 源代码中!对此感到抱歉-您需要单击输入/按钮才能使其正常工作...尝试使用新的xpath,如果您需要有关如何验证chrome devtools中是否存在xpath的步骤,请告诉我-我将更新上面的内容新的 xpath 也是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2021-12-05
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多