Selenium,等待元素,页面对象模型,c#绑定

时间:2013-01-22 10:28:41

标签: c# selenium webdriver automated-tests selenium-webdriver

我们如何等待(重新)附加到DOM的IWebElement?我的情况是这样的,我从dropdown1中选择一个值,然后在dropdown2上发生单击数据绑定。因此,当我的测试类似于从Dd1中选择“foo”时,则从Dd2中选择“bar” - >我会得到一个例外,因为Dd2尚未渲染,所以存在竞争条件。 现在,我知道,我们有WebDriverWait类,我们可以像这样使用Until方法:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
wait.Until(By.Id("foo"));

但我真的不想将定位器字符串(“foo”)带到我的测试逻辑中,因为它似乎正在打败使用页面对象模型的点。使用Page对象模型时,我已经有了IWebElement实例

[FindsBy(How = How.Id, Using = "ctl00_MainContentPlaceHolder_actionButtonBarControl_btnSave")]
    public IWebElement BtnSave { get; set; }

那么,你知道有什么方法可以隐式等待IWebElement为通信做好准备吗?

3 个答案:

答案 0 :(得分:3)

嗨,我知道它有点晚了,但我遇到了同样的问题,我通过以下方式(使用您的代码)解决了这个问题:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
wait.Until(By.Id(_pageModel.BtnSave.GetAttribute("id"));

然后只返回ID属性的值,并停止使用元素查找污染测试代码。希望能帮助到你。

答案 1 :(得分:1)

如果您不想使用locator values,则意味着可以使用隐式等待,而不是使用显式等待。隐式等待也使driver实例等待给定的时间段。

Actual difference to Explicit Wait is that it will tell Web driver to poll the DOM for a certain amount of time when trying to find an element or elements if they are not immediately available.The default setting is 0.

代码:

  driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

要记住的一件事是,一旦设置了隐式等待 - 它将保留WebDriver对象实例的生命周期。

有关详细信息,请使用此链接http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#implicitlyWait(long,java.util.concurrent.TimeUnit)

答案 2 :(得分:0)

我们所做的是传递seleniumRC css=a, xpath=b中的原始选择器文字。

然后我们有一个findElement方法来解析请求,获取相应的By并搜索元素