【问题标题】:If element present do stuff, if not present skip next如果元素存在做事,如果不存在跳过下一个
【发布时间】:2021-04-05 22:42:26
【问题描述】:

我遇到了这样一种情况,如果一个元素存在,我需要做一些事情,如果该元素不存在,我将需要跳到代码的其余部分。我尝试了几种方法,但我不知道为什么它不起作用,代码对我来说看起来很合乎逻辑并且它适用于类似的宏。 代码如下:

Do
    DoEvents
Loop Until driver.ExecuteScript("document.readystate") <> "complete"

If driver.FindElementByName("x").IsPresent Then
Item.Offset(0, 2).Value = "Completed already" 'And need to skip to next iteration

ElseIf driver.FindElementByName("x") Is Nothing Then
Set cancel= driver.FindElementByName("cancelbutton")
cancel.Click


Set myVar= Item.Offset(0, 1)
Set radiobtn = driver.FindElementByXPath("//input[@value='" & myVar & "']")    
radiobtn.Click

Set cancelSelected = driver.FindElementByName("submitCancel")
cancelSelected.Click
driver.SwitchToAlert.Accept
Item.Offset(0, 2).Value = "Canceled"
driver.Refresh
driver.Wait 1000
End If

我也尝试过如果元素 X 存在,则查找其他元素的情况

If driver.FindElementByName("x").IsPresent Then
Item.Offset(0, 2).Value = "Completed already"

ElseIf driver.FindElementByName("Y").IsPresent Then
Set cancel= driver.FindElementByName("cancelbutton")
cancel.Click


Set myVar= Item.Offset(0, 1)
Set radiobtn = driver.FindElementByXPath("//input[@value='" & myVar & "']")
radiobtn.Click

Set cancelSelected = driver.FindElementByName("submitCancel")
cancelSelected.Click
driver.SwitchToAlert.Accept
Item.Offset(0, 2).Value = "Canceled"
driver.Refresh
driver.Wait 1000
End If

当元素 X 出现在页面上时,元素 Y 不存在,反之亦然。我也试过.count &gt; 0,但还是不行。任何人都可以帮助我解决问题或给我一些提示和技巧吗?

【问题讨论】:

  • 请问有我们可以使用的 url 来解决这个问题吗?
  • 当然,请为场景提供合适的 x,y 值
  • 很遗憾,即使我分享了一个 URL,您也看不到它,因为它与业务相关并由 VPN 和 2factor 身份验证器保护..
  • 请提供更多详细信息,然后说明您尝试了什么以及每种情况下的确切结果是什么,包括完整的任何错误消息。如果使用并与错误消息相关,请包括您添加的显式等待时间,
  • readystate 不会等到所有元素都加载完毕。它不如内置的隐式 webdriver 等待可靠。如果抛出错误,为什么不设置一个处理该场景的错误处理部分,然后在旁边有一个简历带您返回?只要您在错误处理程序之前有一个退出子程序,并且在错误处理程序中进行适当的 err.Number 测试就可以了,即使用错误或缺少错误来分支您的代码。记得重置错误。

标签: vba selenium automated-tests web-testing webautomation


【解决方案1】:

尽量不要使用 driver.findelement 而是 driver.findelements(By.whatever).size()>0 我希望它适用于 vbs,它适用于 Java 100%。

【讨论】:

  • 感谢您的回答,在 VBA 中我们可以同时编写 driver.find 两种方式,我之前也尝试过这种方式,但它不起作用。
  • 如果是这种情况,您可能需要一些时间来等待该元素,您可以使用智能等待,例如 WebDriverWait w1 = new WebDriverWait(driver, 8); w1.until(ExpectedConditions.or(ExpectedConditions.presenceOfElementLocated(By.id("submit_btn")), ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.visible-desktop a.hosted-payment-btn.btn-primary")) ));然后使用 size 的东西。
【解决方案2】:

其实,我在 Udemy 上买了一门课程,自己找到了答案。有几种方法可以查找元素是否存在以及如果存在或不存在接下来要做什么。有趣的是,解决方案是如此简单,以至于我很尴尬我错过了它。

第一个Dim By AS New By 然后在 if 子句前后添加一瞬间的等待:

driver.Wait 500
If driver.IsElementPresent(By.Name("uncompleteButton__")) Then
Item.Offset(0, 2).Value = "Can't do stuff, go to next iteration."
Else
Set cancelitemsbtn = driver.FindElementByName("cancelButton")
cancelitemsbtn.Click
Item.Offset(0, 2).Value = "Can do stuff"
driver.Wait 500
End if

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2011-08-16
    • 1970-01-01
    • 2018-12-29
    • 2018-12-09
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多