我是第一次做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”
答案 0 :(得分:3)
waitForCondition
仅适用于Javascript调用,不适用于等待加载元素。
isElementPresent
中的内容很好。我会将它与显式等待结合起来,以便更准确地了解元素何时实际加载并出现在屏幕上:
答案 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);