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的Selenium WebDriver测试中waitForVisible/waitForElementPresent的等价物?_Java_Selenium_Webdriver_Selenium Webdriver_Selenium Ide - Fatal编程技术网

使用Java的Selenium WebDriver测试中waitForVisible/waitForElementPresent的等价物?

使用Java的Selenium WebDriver测试中waitForVisible/waitForElementPresent的等价物?,java,selenium,webdriver,selenium-webdriver,selenium-ide,Java,Selenium,Webdriver,Selenium Webdriver,Selenium Ide,使用“HTML”Selenium测试(使用Selenium IDE创建或手动创建),您可以使用一些类似于WaitForElementPresent或WaitForVisible的测试 <tr> <td>waitForElementPresent</td> <td>id=saveButton</td> <td></td> </tr> 编写此类检查代码的最干净、最健壮的方法是什么

使用“HTML”Selenium测试(使用Selenium IDE创建或手动创建),您可以使用一些类似于
WaitForElementPresent
WaitForVisible
的测试

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>
编写此类检查代码的最干净、最健壮的方法是什么


到处添加
Thread.sleep()
调用将是丑陋而脆弱的,而滚动自己的while循环似乎也相当笨拙……

问题是,您可能实际上不希望测试无限期地运行。在库决定元素不存在之前,您只需要等待更长的时间。在这种情况下,最优雅的解决方案是使用隐式等待,它的设计目的就是:

driver.manage().timeouts().implicitlyWait( ... )
隐式等待

隐式等待是告诉WebDriver轮询DOM一段时间 尝试查找一个或多个元素(如果有)的时间量 目前还没有。默认设置为0。一旦设置,则 为WebDriver对象实例的生命周期设置隐式等待

显式等待+

显式等待是定义为等待特定条件的代码 在代码中继续之前发生。最坏的情况 是Thread.sleep(),它将条件设置为 等待这里提供了一些方便的方法来帮助您编写 只在需要时等待的代码。WebDriverWait 与ExpectedCondition相结合是实现这一点的一种方法 完成


对于单个元件,可使用以下代码:

private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }
for (int second = 0;; second++) {
            if (second >= 60){
                fail("timeout");
            }
            try {
                if (isElementPresent(By.id("someid"))){
                    break;
                }
                }
            catch (Exception e) {

            }
            Thread.sleep(1000);
        }
在抛出TimeoutException或 它发现元素将在0-10秒内返回它。WebDriverWait 默认情况下,每隔500毫秒调用ExpectedCondition,直到 成功返回。成功返回符合预期条件 对于所有其他类型,类型为布尔返回true或非null返回值 ExpectedCondition类型


元素可单击-显示并启用该元素


另一种等待一定量的最长时间的方式,例如10秒,元素显示如下:

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });
(新的WebDriverWait(驱动程序,10))。直到(新的ExpectedCondition(){
公共布尔应用(WebDriver d){
返回d.findElement(By.id(“”).isDisplayed();
}
});

谢谢!这似乎很完美。。除了我的waitForVisible用例不起作用之外。我假设WebDriver在
findElement()
中应用了超时,但是如果它立即成功返回,并且
isDisplayed
随后失败,因为它还不可见(请参阅相关Java代码)…@Jonik:我之前已经回答了这个问题:。诀窍是使用
WebDriverWait
,您可以指定一个轮询的回调。它类似于轮询自己,但它是抽象的。它还处理超时问题。答案中的代码需要稍加修改,但你应该明白了。只是验证了这确实可以作为waitForElementPresent等价物(直接)工作。谢谢,我明天会研究另一个答案(现在想都想不起来了):)验尸后提示:隐式等待中断了ExpectedConditions,它在内部使用driver.findElement。ExpectedConditions是类还是接口?如果是这样的话,应该导入什么包呢?@Ripolawasim你现在可能知道了,但我试着回答所有的问题。。。从JavaDoc中可以看出,它是一个具有静态方法的类,包含在
org.openqa.selenium.support.ui
包中。那么隐式等待是否也适用于尝试单击但仍被禁用的元素?假设我单击一个按钮以显示另一个按钮。然后我试着点击另一个按钮。然后WebDriver意识到另一个按钮被禁用。现在发生了什么?它是否引发异常,还是等待隐式等待当前驱动程序中配置的秒数,然后再次尝试单击它???@Mercious您可以自己轻松尝试,但我会节省您的时间-它引发异常。该按钮将被找到,因此WebDriver不会隐式地等待它被启用。你需要写一个显式的等待,如果测试容易的话,我会这么做的。当这样的事情失败时,我几乎猜不出哪里出了问题,因为我正在测试的网站也使用了很多。。。混乱的java脚本。我想弄清楚这件事。感谢您回答澄清这一点,这很有帮助。您需要使用WebDriverWait类-查看此类了解更多信息-此代码包含太多气味,很难认真对待。1.你重新设计轮子。请参阅内置等待的其他答案。2.Thread.sleep很难看而且容易出错。3.正如捕获一般异常一样。4.“如果”不带花括号,这是常见的bug来源。5.什么是“fail()”?最好在测试中抛出一个有意义的异常。6.您将循环条件从“for”语句中删除。7.在一行中编写多个语句可能看起来很酷,但事实并非如此。这篇文章的缩进也被打破了,我同意。最好的方法是使用显式等待(WebDriverWait)。使用Thread.sleep()是不好的。根据您的评论,我在if语句中用大括号重新组织了代码,使其更具可读性。谢谢你的评论。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }
for (int second = 0;; second++) {
            if (second >= 60){
                fail("timeout");
            }
            try {
                if (isElementPresent(By.id("someid"))){
                    break;
                }
                }
            catch (Exception e) {

            }
            Thread.sleep(1000);
        }
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });