我看到许多等待html控件变为“存在”的例子,即由于ajax调用,java事件处理程序等等。
但在我的情况下,我的ajax代码不会实例化或使新控件可见;它用新值重新填充现有的控件。
我想要做的是隐式等待这些值“显示”,但我不知道这是否可以在Selenium 2.0中使用?
迈克尔
答案 0 :(得分:0)
Selenium有两种类型的等待命令
1 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
2 WebDriverWait.until(condition-that-finds-the-element)
示例来自:
How can I ask the Selenium-WebDriver to wait for few seconds in Java?
展示了一些你可以使用的东西
public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
}
答案 1 :(得分:0)
由于这些元素已经存在,如果你对这些元素使用findElement()
,那么你将避免使用StaleReferenceException,你会没事的。
您的测试流程看起来像这样(请注意,这是使用找到的框架here
@Config(url="http://systemunder.test", browser=Browsers.CHROME)
public class MyTest extends AutomationTest {
@Test
public void myTest() {
click(By.id("somethingThatTriggersAjax")
.validateText(By.id("existingId"), "test"); // this would work..
}
}
在那里使用框架,它更容易,并处理它自己的等待,以及ajax的帐户。但是如果你喜欢香草 -
public void test() {
WebElement element;
element = driver.findElement(By.id("somthingThatTriggersAjax"));
// now ajax has done something.
element = driver.findElement(By.id("existingId")); // now this will be updated with the new element information.
}
这两种解决方案的替代方案是使用WebDriverWait
的..在你的情况下,它就像是......
WebDriverWait.until(ExpectedConditions.textPresentIn(By.id("existingId"), "some text you'd expect"));