运行Selenium WebDriver测试用例时,我想要一致的输出。
我在java类中有超过30个测试用例。当我运行它时,我会遇到不同方法的错误。例如。有时它在第12个测试用例中失败,有时在第8个测试用例失败,有时在第2个方法失败,有些时候都在运行而没有任何错误。我确信所有的测试用例都是正确的。
测试速度非常快。我认为这将是问题所在。所以我添加了
new FireFoxDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
即使它不一致
任何人都可以尽快帮助我吗?
答案 0 :(得分:11)
我不同意Arran关于UI测试非常不可靠的说法。绝对不一定。学习两个主要问题的可靠方法通常会解决很多问题。
间歇性故障通常是由动态内容周围的同步问题引起的,或者定位器不够灵活,无法处理不断变化的情况。
例如,您从网格/表中提取行,并且您的定位器是基于位置的。 (第3行,第5个单元格)排序顺序在一次运行中不同,因此测试会中断。某些服务器端技术(如ASP.NET)生成的动态ID可能会有所不同,因此这是另一个问题。
我建议您仔细评估您的定位器/选择器,看看它们是否健壮。避免使用硬连线的xpath,尽可能使用ID - 但要确保它们不是动态ID,并且如果它们适当地处理它们。
您提到过您尝试过使用隐式等待。确保您了解隐式和显式等待之间的区别。 (阅读更多here in Selenium docs。)您可能需要明确等待脚本中后续步骤的确切条件。除非在特殊情况下,否则请勿在测试中重复使用Thread.Sleep或类似的手动延迟。 WebDriver的等待是一种更好的方法。
答案 1 :(得分:2)
我发现Selenium测试经常失败,因为页面元素未正确加载,即使你已经设置了隐式等待。如果测试在同一点上莫名其妙地失败,这对我有用。试试这个(我的代码是C#,但你可以用其他语言完成):
在测试初始化中设置等待:
globalWait = new WebDriverWait(driver,TimeSpan.FromSeconds(20));
然后在加载麻烦的页面时调用wait: globalWait.Until(ExpectedConditions.ElementIsVisible(By.Id(" myPageElement&#34)));
这会强制等待直到元素可见。它为我解决了很多问题。通常我将id设置为页脚元素,或者如果它是AJAX页面,则将其设置为AJAX检索的元素之一。这可以确保页面已正确加载。
另一种技术是编写登录和注销的常用例程,如果您正在进行大量复杂的测试,请登录,进行一些测试,注销,然后登录并进行更多测试。这似乎可以减少Selenium中的虚假错误。
我的C#登录例程:
private void Login()
{
driver.Navigate().GoToUrl(base_url + "/login");
globalWait.Until(ExpectedConditions.ElementIsVisible(By.Id("username")));
driver.FindElement(By.Id("username")).SendKeys(username);
// clear IE password autocomplete
driver.FindElement(By.Id("password")).Clear();
driver.FindElement(By.Id("password")).SendKeys(password);
driver.FindElement(By.Id("btn_login")).Click();
}
我的注销程序:
private void LogOut()
{
driver.FindElement(By.Id("lnkMenuLogout")).Click();
}
使用它们的测试:
[TestMethod]
public void EditAccount()
{
Login();
// navigate to account page
driver.FindElement(By.Id("ulMenu")).FindElement(By.Id("lnkMenuAccount")).Click();
Assert.IsTrue(driver.FindElement(By.Id("headName")).Displayed, "Player name not displayed");
string playerChangeName = "Test" + DateTime.Now.ToString("yyyyMMddHHmmss");
driver.FindElement(By.Id("butEditName")).Click();
driver.FindElement(By.Id("surname")).Clear();
driver.FindElement(By.Id("surname")).SendKeys(playerChangeName);
driver.FindElement(By.Id("butSaveName")).Click();
driver.Navigate().Refresh();
// check that edit worked
Assert.IsTrue(driver.FindElement(By.Id("headName")).Displayed, "Player name not displayed after change");
IWebElement element = driver.FindElement(By.Id("headName"));
string playerName = element.Text;
StringAssert.Contains(playerName,playerChangeName,"Player name has not been changed");
LogOut();
}
我的最后结论是,目前,Selenium仍然有点“fla”。我目前正在试验PhantomJS,但似乎并没有更好。硒是我们最好的。
答案 2 :(得分:1)
我最好的答案是添加“可靠性和恢复代码”。
例如,也许您的测试试图点击某些内容,但随机出现的问题无论出于何种原因都是陈旧的。因此,添加捕获StaleElementExceptions的代码,并在真正失败之前重试最多5次。
或者,有时页面加载速度有点太慢,而且在Selenium认为完成之前内容尚未更新(AJAX功能)。这会导致检查失败,但在查看屏幕截图时,页面实际上是正确的,因为这一切都在不到0.2秒内发生。因此,在使用断言调用之前,添加一个等待更新内容的selenium等待。
这实质上为您提供了更可靠的结果,因为您的测试代码现在知道如何使用selenium框架处理常见情况。
希望这有帮助!