使用Selenium VBA在弹出窗口中单击OK

使用Selenium VBA在弹出窗口中单击OK,vba,selenium,xpath,css-selectors,popupwindow,Vba,Selenium,Xpath,Css Selectors,Popupwindow,尝试自动化在线订单流程。订单规格完成后,按保存按钮。如果项目规格(高度)大于1000mm,将显示弹出窗口。我无法自动单击它。它不在iframe中 在下面代码的第二行: bot.FindElementById(“ctl00\u main content\u ucordedtailblind\u btnSave”)。单击 如果>1000mm条件为真,“单击”将导致弹出警告显示。它只有一个按钮-“确定”(编码为nbsp;OK nbsp;)。手动单击允许自动进入下一页,但我需要帮助获得自动执行此操作的编

尝试自动化在线订单流程。订单规格完成后,按保存按钮。如果项目规格(高度)大于1000mm,将显示弹出窗口。我无法自动单击它。它不在iframe中

在下面代码的第二行:
bot.FindElementById(“ctl00\u main content\u ucordedtailblind\u btnSave”)。单击

如果>1000mm条件为真,“单击”将导致弹出警告显示。它只有一个按钮-“确定”(编码为nbsp;OK nbsp;)。手动单击允许自动进入下一页,但我需要帮助获得自动执行此操作的编码。此时代码显示为挂起,显示弹出窗口。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(文本和样式):

警告

警告文字

如有任何建议,我们将不胜感激。谢谢。

要单击值为“确定”的元素,您可以使用以下任一选项:

  • 使用
    FindElementByCss()

  • 使用
    findelementbypath()


尝试使用javascript单击按钮:

[编辑-更新的标识符]

element=bot.FindElementByXPath("//input[@id='popup_ok']")
x =bot.ExcuteScript("arguments[0].click();", element)
[以上代码已更新-见备注] [下文新增] 让它如预期的那样运行起来有点乐趣

这是我的小测试函数,让您了解我用来检查的内容:

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

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

我尝试使用Css和XPath方法,还尝试了:
bot.findelementbypath(//div[@id='popup\u container']//div[@id='popup\u content']//div[@id='popup\u panel']]/input[@id='popup\u ok'])。单击
不确定语法是否正确-但它不起作用。错误发生在它执行下一条指令时,因此我断定它没有离开页面。谢谢你给我更多的建议谢谢。一旦我解决了另一个问题,这个解决方案就起作用了。很抱歉,我无法转换为Selenium VBA Syntax。不用担心,伙计。我上网后再看看:-)嗨,里奇,谢谢。我将此行替换为bot.FindElementById(“ctl00\u mainContent\u ucordedtailblind\u btnSave”)。单击这些
Set element=bot.FindElementById(“ctl00\u mainContent\u ucordedtailblind\u btnSave”)
X=bot.ExecuteScript(“参数[0]。Click()”,element)
。什么样的变量是“X”?当例程试图找到一个不存在的元素时,它会暂停—所以我猜它没有关闭弹出窗口—我无法告诉您x是什么—如果不指定返回变量,它就不会为我运行。如果在查找对象时出现延迟,请尝试另一个标识符?-尝试一个通用的xpath,比如//input[@id='popup\u ok'],我现在知道了,我借用了你现有的findby id,它不在你的html源代码中!很抱歉-您需要单击输入/按钮以使其工作。。。尝试新的xpath,如果您需要验证chrome devtools中是否存在xpath的步骤,请告诉我-我也将使用新的xpath更新上述内容
bot.Wait 5000
bot.FindElementByXPath("//div[@id='popup_container']//div[@id='popup_panel']/input[@id='popup_ok']").Click
element=bot.FindElementByXPath("//input[@id='popup_ok']")
x =bot.ExcuteScript("arguments[0].click();", element)
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