当前位置: 首页 > 知识库问答 >
问题:

在Selenium Webdriver中,ExpectedCondition.ElementToBeclickable不会等待进度条消失

毕黎昕
2023-03-14

这个问题与下面的问题类似:
即如何等待进度条消失。
如何在Selenium WebDriver中动态等待进度条完全加载?

我的情况有点不同。在我的场景中,当进度条出现时,所有元素都被禁用。我正在使用显式等待,但仍然得到异常。

方案:在“注册”页中提供所有详细信息后,脚本单击“创建帐户”按钮。此时将出现一个圆形进度条,并持续1或2秒。如果输入的密码无效,则错误消息将显示在注册页面的顶部。我现在需要点击“取消”按钮并重复这个过程。

当进度条出现时,整个页面将被禁用。用户只有在进度条消失后才能继续。

下面是我的代码:

WebDriverWait myWaitVar=new WebDriverWait(驱动程序,20);

点击“创建帐户”按钮后,会显示进度条。代码现在应该等到“取消”按钮出现。

//Click on the "Create Account" button.
driver.findElement(By.id("createAccount")).click();

//Wait till the "Cancel" button shows up -- this may take some time.
myWaitVar.until(ExpectedConditions.elementToBeClickable (By.id("cancelRegister")));

//Click on the "Cancel" button.
driver.findElement(By.id("cancelRegister")).click();

当我执行上面的代码时,我总是在最后一行得到NoSuchelementException

我尝试使用ExpectedCondition.VisibilityOfElement()但这也会产生NoSuchelementException

我能让它工作的唯一方法就是强迫它睡觉:

Thread.sleep(3000);

脚本与睡眠很好地配合使用。

为什么webdriverwait不等到进度条消失?代码成功分析了ElementToBeclickable(),但单击“取消”按钮时总是引发异常。

共有1个答案

何建中
2023-03-14

expectedconditions.elementtobeclickable返回元素如果条件将为true,则表示返回元素如果元素出现在页面上且可单击,则无需再次查找此元素,只需省略最后一行,如下所示:-

//Click on Create Account btn:
driver.findElement(By.id("createAccount")).click();

//Wait till "Cancel" button is showing up. At cases, it may take some time.
WebElement el = myWaitVar.until(ExpectedConditions.elementToBeClickable(By.id("cancelRegister")));
el.click();

Edited1:-如果由于其他元素接收单击而无法单击,则可以使用JavaScriptExecutor执行单击,如下所示:

//Click on Create Account btn:
driver.findElement(By.id("createAccount")).click();

//Wait till "Cancel" button is showing up. At cases, it may take some time.
WebElement el = myWaitVar.until(ExpectedConditions.elementToBeClickable(By.id("cancelRegister")));
((JavascriptExecutor)driver).executeScript("arguments[0].click()", el); 

Edited2:-从提供的例外情况来看,进度条仍然覆盖在cancelregister按钮上。所以最好的方法是先等待进度条的不可见性,然后等待cancelregister按钮的可见性,如下所示:

//Click on Create Account btn:
driver.findElement(By.id("createAccount")).click();

//Now wait for invisibility of progress bar first 
myWaitVar.until(ExpectedConditions.invisibilityOfElementLocated(By.id("page_loader")));

//Now wait till "Cancel" button is showing up. At cases, it may take some time.
WebElement el = myWaitVar.until(ExpectedConditions.elementToBeClickable(By.id("cancelRegister")));
el.click();

希望它行得通...:)

 类似资料:
  • 问题内容: 这个问题类似于下面的问题: 即如何等待进度条消失。 如何动态等待进度条完全加载到Selenium Webdriver中? 我的情况有些不同。在我的方案中,进度条出现时,所有元素都被禁用。我正在使用显式等待,但仍收到异常。 场景: 在“注册”页面中提供所有详细信息之后,脚本单击“创建帐户”按钮。此时会出现一个圆形进度条,它会持续1或2秒钟。如果输入的密码无效,则会在“注册”页面顶部显示错

  • 我实际上有三个问题: Selenium WebDriver如何实现此 因为我们不能给无限睡眠的线程一个负值。 有没有更好的方法来实现无限等待? 我们在SeleniumWebDriver文档中看到了这一点

  • Hi akka古鲁们:)你能在这一次指导我吗? 我要做的是-演员A向演员B要消息,然后等一个回来。但是,不知何故,演员B给A的不是一条信息,而是其中的4条信息。A正确完成,但rest消息中有3条被算作死信。为什么?这样对吗?我是说,演员A有一个合适的处理人,那为什么信都死了?:-( [INFO][11/22/2013 22:00:38.975][ForkJoinPool-2-worker-7][a

  • 操作:如果我点击任何一个链接,当页面加载完成时,进度条就会显示出来,然后这个进度条就会被隐藏 疑惑:我们想要自动化以上动作,我如何检查进度动作是否完成 下面是html代码 单击链接后,html看起来如下所示 则页面加载完成的html如下所示 那么如何检查进度条是否完成呢?目前我使用的是thread.sleep(),但有时web驱动程序会引发异常 请提供一个如何处理显式wait的建议

  • 由于我在堆栈中使用Vertx3.1,我想使用这些工具带来的未来特性,但在阅读后,API似乎对我来说相当有限。我甚至找不到方法让未来等待一个可观察的。这里是我的代码 在我第一次观察到的onComplete中,我正在检查结果,在finish之后是当我完成以后解除阻塞的操作。但是我正在寻找未来。结果不会被阻止,直到未来。完成像我期望的那样被调用。而是返回null。 问候。

  • 我如何获得第二条信息?