我使用yadda库使用selenium-webdriver进行功能测试。问题是,在我的不同环境中,相同的测试套件工作方式不同。例如:
在测试中,根据我输入的环境,结果会有所不同。
本地 localhost:5000
Open my search site
․ when i go to my site: 2169ms
․ when i write a text on the search input: 21ms
․ when i click the search button: 130ms
․ then i get the results page.": 46ms
暂存 mystaging.domain.com
Open my search site:
StaleElementReferenceError: {"errorMessage":"Element is no longer attached to the DOM","request":{"headers":{"Accept":"application/json; charset=utf-8","Connection":"close","Content-Length":"2"
制作 www.domain.com
Open my search site
․ when i go to my site: 2169ms
․ when i write a text on the search input: 21ms
․ when i click the search button: 130ms
․ then i get the results page.": 46ms
此时,只有登台测试失败,但在其他情况下,当互联网连接速度变慢时,测试会在生产中失败但会通过升级。 主要的问题是浏览器没有为测试准备好DOM,他们也没有找到测试所需的元素。
我尝试解决此问题的方法,等待我的页面的根元素如下:
return driver.wait(() => driver.isElementPresent(By.css(".my__homepage")), 50000);
但这对我来说还不够,因为测试套件仍然随机失败。所以,我的问题是:
这可能是在不同环境中运行的最佳方法,测试套件处理浏览器上尚未准备好的元素?
答案 0 :(得分:0)
我向您展示了一个简单的C#代码,我在IE浏览器中为我的工作做了这些代码,但它可以用于其他浏览器和语言。
private static WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(120)); //max driver wait timeout 120 seconds
try
{
//waiting for document to be ready
IJavaScriptExecutor jsExecutor = (IJavaScriptExecutor)driver;
wait.Until(sc => jsExecutor.ExecuteScript("return document.readyState").Equals("complete"));
//waiting for an element.
//use 'ExpectedConditions.ElementToBeClickable' as in some cases element gets loaded but might not be still ready to be clicked
wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("elementID")));
}
catch (Exception ex)
{
}
注意:Addiotinally您可能还需要根据需要检查其他元素属性(如启用/禁用等)。