我们如何等待(重新)附加到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为通信做好准备吗?
答案 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对象实例的生命周期。
答案 2 :(得分:0)
我们所做的是传递seleniumRC css=a, xpath=b
中的原始选择器文字。
然后我们有一个findElement
方法来解析请求,获取相应的By
并搜索元素