是否有可能在Selenium 2.0中隐含等待值的变化?

时间:2013-10-10 13:50:28

标签: ajax selenium

我看到许多等待html控件变为“存在”的例子,即由于ajax调用,java事件处理程序等等。

但在我的情况下,我的ajax代码不会实例化或使新控件可见;它用新值重新填充现有的控件。

我想要做的是隐式等待这些值“显示”,但我不知道这是否可以在Selenium 2.0中使用?

迈克尔

2 个答案:

答案 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);
}

另请查看http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html了解详情。

答案 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"));