我正在使用Selenium 2(来自Googlecode的最新版本),我让它启动Chrome并转到网址。
页面加载后,会执行一些javascript来设置文本框的值。
我告诉它通过id找到一个文本框,但它没有其中的值(如果我硬编码它找到的值)。
查看PageSource,例如Console.WriteLine(driver.PageSource);显示html,文本框为空。
我尝试过使用:
driver.FindElement(By.Id(“txtBoxId”)获取元素,但也没有获取值。
我还尝试过ChromeWebElement cwe = new ChromeWebElement(driver,“txtBoxId”); (抱怨Stale数据)。
有什么想法吗?
约翰
答案 0 :(得分:4)
最后我找到了答案!这是适合我的代码
WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0,0,60));
wait.Until(driver1 => _driver.FindElement(By.Id("ctl00_Content_txtAdminFind")));
Assert.AreEqual("Home - My Housing Account", _driver.Title);
这是我的来源! http://code.google.com/p/selenium/issues/detail?id=1142
答案 1 :(得分:2)
Selenium 2没有为DOM中的元素内置的等待函数。这与Selenium 1中的相同。
如果你必须等待某事,你可以将其作为
public string TextInABox(By by)
{
string valueInBox = string.Empty;
for (int second = 0;; second++) {
if (second >= 60) Assert.Fail("timeout");
try
{
valueInBox = driver.FindElement(by).value;
if (string.IsNullOrEmpty(valueInBox) break;
}
catch (WebDriverException)
{}
Thread.Sleep(1000);
}
return valueInBox;
}
或者那些行
答案 2 :(得分:1)
我通过ruby使用webdriver(黄瓜watir-webdriver,实际上),我倾向于这样做:
def retry_loop(interval = 0.2, times_to_try = 4, &block)
begin
return yield
rescue
sleep(interval)
if (times_to_try -= 1) > 0
retry
end
end
yield
end
然后,每当我因javascript写入或其他内容而出现内容时,我只需将其包装在retry_loop中,如下所示:
retry_loop do #account for that javascript might fill out values
assert_contain text, element
end
正如您所注意到的那样,如果它已经存在则没有性能损失。相反的情况(检查某些东西不存在)显然需要达到超时。 我喜欢在方法和测试代码中保存细节的方式。
也许你可以在C ++中使用类似的东西?