Java 如何等待按钮内的加载程序完成加载?
按下按钮后,我需要等待特定加载程序完成加载,请查看下图: 如上图所示,一旦按下按钮,ajax加载程序就会出现在按钮内 我已创建以下选择器来定位按钮:Java 如何等待按钮内的加载程序完成加载?,java,selenium,testing,selenium-webdriver,automated-tests,Java,Selenium,Testing,Selenium Webdriver,Automated Tests,按下按钮后,我需要等待特定加载程序完成加载,请查看下图: 如上图所示,一旦按下按钮,ajax加载程序就会出现在按钮内 我已创建以下选择器来定位按钮: //form[contains(@id, 'messageform')]//button/span 当前接受请求(单击按钮)会使我的测试用例失败,因为脚本将继续执行下一个测试步骤,而不等待加载程序完成 我尝试了以下方法,但没有成功: 注入JS以等待页面完全加载 ExpectedCondition<Boolean> expectat
//form[contains(@id, 'messageform')]//button/span
当前接受请求(单击按钮)会使我的测试用例失败,因为脚本将继续执行下一个测试步骤,而不等待加载程序完成
我尝试了以下方法,但没有成功:
- 注入JS以等待页面完全加载
ExpectedCondition<Boolean> expectation = driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete");
有什么想法吗?您应该使用
.stalenessOf()
等待元素不再附加到DOM
类似这样的情况(根据您的情况调整):
好的是你不必处理任何异常
或者,您也可以创建一个方法并处理异常,如下所示:
public static void WaitForCommission (WebDriver driver) throws Exception {
for (int second = 0; second++) {
if (second >= 30) fail("timeout");
try {
if (IsElementActive(By.id("someElementID"), driver))
break;
} catch (Exception e) {}
Thread.sleep(1000);
}
}
private static boolean IsElementActive(By id, WebDriver driver) {
WebElement we = driver.findElement(id);
if(we.isEnabled())
return true;
return false;
}
注入JS以等待页面完全加载的代码试用
和预期条件。不可见性(元素)
?@DebanjanB示例已附加。如您在下面的评论中所要求的,我可以发布解决方案,但首先我需要更多信息。请在单击之前、单击之后、微调器在内部时以及微调器消失且按钮处于最终状态后发布按钮的HTML。另外,请将HTML(这三种状态)作为文本而不是图像发布。对于我们来说,在示例页面中使用HTML、创建定位器等更容易,因为使用的文本不是图像。一旦你这么做了,给我发个信息,我会看一看。你使用的IsElementActive()
既混乱又不必要。硒术语中的“活性”是什么意思?您正在检查.isEnabled()
,为什么不调用它IsElementEnabled()
?但在这一点上,当您所做的只是driver.findElement().isEnabled()
,为什么还需要该方法呢?该方法已经存在于Selenium中,因此不需要只增加不必要复杂性的包装器。此外,启用意味着什么,除非您正在检查输入。当检查是否启用时,所有可见的元素都返回true
,那么为什么不检查isVisible呢?另外,您正在编写代码,在WaitForCommission()
中等待“Active”。Selenium已经为此提供了WebDriverWait()
。。。不要写已经写过的东西。整个WaitForCommission()
应该是newwebdriverwait(driver,30)。直到(ExpectedConditions.visibilityOfElementLocated(locator))
@JeffC您能发布解决方案的完整代码吗?完全正确@JeffC,很高兴利用这些努力与我们分享您的建议(重构代码),我们都可以从中学习。“你会帮助别人的。”我给OP留下了一条关于这个问题的信息。一旦我有了这些问题的答案,我会留下一个答案。
WebElement somePageElement = driver.findElement(By.id("someId"));
WebDriverWait wait = new WebDriverWait(webDriver, 10);
// do something that changes state of somePageElement
wait.until(ExpectedConditions.stalenessOf(somePageElement));
public static void WaitForCommission (WebDriver driver) throws Exception {
for (int second = 0; second++) {
if (second >= 30) fail("timeout");
try {
if (IsElementActive(By.id("someElementID"), driver))
break;
} catch (Exception e) {}
Thread.sleep(1000);
}
}
private static boolean IsElementActive(By id, WebDriver driver) {
WebElement we = driver.findElement(id);
if(we.isEnabled())
return true;
return false;
}