6

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

不管我选择什么,它总是返回“false”。如果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"

4

6 回答 6

3

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

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

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

于 2012-11-27T16:48:08.533 回答
2

C#

你可以这样做:

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

然后你可以使用条件。

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

或者

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

就这样。

于 2016-11-22T15:00:20.257 回答
1

你可以这样做:

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

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

于 2012-11-28T09:54:50.113 回答
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 请求。

于 2015-10-27T10:56:42.897 回答
0

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

您可以看到他们还写了有关 ExpectedConditions 类的内容。这包含 ExpectedCondition 类的几个有用的实现,例如“是元素存在一个”,即 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,然后返回元素呢?

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

您传递的 ExpectedCondition “函数”还返回一个值,如果您正在等待某个元素(或 WebDriver 中的某个其他值)的条件,这可能很有用,因此返回它可以为您节省额外的调用。

于 2012-11-27T19:43:24.380 回答
0

试试这个:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);
于 2017-03-15T12:21:47.400 回答