Selenium waitForCondition

时间:2012-11-27 16:43:57

标签: ajax selenium

我是第一次做Selenium测试。在主页上,我调用了一些AJAX,我希望Selenium等待元素加载完成。我不确定它是否有效,但我只是键入selenium并且waitForCondition能够选择。

我不管我选择它总是返回“假”。如果 waitForCondition 甚至可以工作,我现在不行?

如何测试它是否有效? 我在这段代码中做错了什么?

 selenium.waitForCondition("//input[@name='Report'", "3000");
 selenium.waitForCondition("//*[@id='MyTable']", "3000");
 selenium.waitForCondition("css=.someClass2", "3000");

如果我按自己的类实现 - 它返回“true”

private boolean isElementPresent(By by) {
    try {
        driver.findElement(by);
        return true;
    } catch (NoSuchElementException e) {
        return false;
    }
}

isElementPresent(By.xpath(“// * [@ id ='MyTable']”)) - 返回“true”

6 个答案:

答案 0 :(得分:3)

waitForCondition仅适用于Javascript调用,不适用于等待加载元素。

isElementPresent中的内容很好。我会将它与显式等待结合起来,以便更准确地了解元素何时实际加载并出现在屏幕上:

http://seleniumhq.org/docs/04_webdriver_advanced.html

答案 1 :(得分:2)

<强> C#

你可以这样做:

首先,您可以为条件设置超时值。

然后你可以使用这个条件。

var Wait = new WebDriverWait(GlobalDriver, TimeSpan.FromMinutes(1));
Wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("xPath"))));

OR

Wait.Until(driver => driver.FindElement(By.XPath("xPath")));

多数人。

答案 2 :(得分:1)

你可以这样做:

selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='Report']\")", "30000");

这将等待元素加载到30秒。

答案 3 :(得分:1)

希望这适合你

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    return (Boolean) js.executeScript("return jQuery.active == 0");
}

});

这将检查jQuery库是否有30秒的任何活动AJAX请求。

答案 4 :(得分:0)

Aaran向您推荐了Selenium WebDriver waits的正确文档。

你可以看到他们也写了关于ExpectedConditions的类。这包含几个有用的ExpectedCondition类实现,例如“is element present one”,即ExpectedConditions.presenceOfElementLocated。

以下是使用它的示例:

WebDriver driver = new ChromeDriver();
driver.get("http://www.degraeve.com/reference/simple-ajax-example.php");

driver.findElement(By.name("word")).sendKeys("bird is the word");;
driver.findElement(By.cssSelector("input[type='button']")).click();
WebDriverWait driverWait = new WebDriverWait(driver, 10);
WebElement dynamicElement = driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#result p")));
System.out.println(dynamicElement.getText());

如果你觉得它太冗长了,你为什么不重构它并提取一个接受元素定位器和webdriver的函数,并返回元素?

接受ExpectedCondition实例的DriverWait.until()就像传递谓词函数,只是通过一个类,或者在文档示例中一个匿名嵌套类,因为在Java下你不能发送一个函数。

你传递的ExpectedCondition“函数”也会返回一个值,这在你等待某个元素(或WebDriver的其他值)的条件时非常有用,所以返回它会为你节省额外的电话

答案 5 :(得分:0)

尝试一次:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);