Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待按钮内的加载程序完成加载?_Java_Selenium_Testing_Selenium Webdriver_Automated Tests - Fatal编程技术网

Java 如何等待按钮内的加载程序完成加载?

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

按下按钮后,我需要等待特定加载程序完成加载,请查看下图:

如上图所示,一旦按下按钮,ajax加载程序就会出现在按钮内

我已创建以下选择器来定位按钮:

//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;
}