2012-10-03 65 views
3

运行Selenium WebDriver测试用例时,我想要一致的输出。如何在运行Selenium Webdriver(Java)测试用例时获得一致的结果?

我在一个java类中有超过30个测试用例。当我运行它时,我收到了不同方法中的错误。例如。有时它会在第12次测试中失败,第8次中某些时候,第2次中某些时候会失败,有时候所有的都没有任何错误地运行。我确定所有的测试案例都是正确的。

它测试非常快。我认为这将是问题。所以我添加

new FireFoxDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

即使它并不一致

谁能帮助我尽快?

+1

好的,第一件事情:自动化UI集成测试很麻烦,而且不可靠,但重点是帮助完成手动测试。接受*现在*,UI测试非常非常不可靠。关键是让它们尽可能可靠*。接下来的事情:这可能是出于任何原因。试过ChromeDriver?你有没有尝试过放入Thread.Sleep? (或者相当于Java?)。页面有时需要一段时间才能加载?你使用的是什么样的选择器?它通常落在XPath选择器上吗?什么?他们复杂吗?你有没有尝试用简单的选择器进行测试? – Arran

+0

如果您提供有关您收到的错误的信息,可能会帮助我们回答问题。如果错误每次都不一样,请举例说明。这听起来像你认为这个问题可能是由于时机。如果是这样,还包括来自测试用例失败的代码。 –

回答

11

我会强烈反对Arran的声明,即UI测试非常不可靠。它绝对不一定是。学习两个主要问题的可靠方法通常可以解决很多问题。

间歇性故障最常见的原因是动态内容或定位器的同步问题,这些问题不够灵活,无法处理变化的条件。

例如,您从网格/表格中提取一行,并且您的定位器是基于位置的。 (第3行,第5单元格)排序顺序在一次运行中不同,因此测试中断。某些服务器端技术(如ASP.NET)会生成可能会有所不同的动态ID,所以这是另一个问题。

我鼓励你仔细评估你的定位器/选择器,看看它们是否健壮。避免使用硬连线的xpath,尽可能使用ID,但要确保它们不是动态ID,并且如果它们恰当地处理它们。

你提到你已经尝试过使用隐式等待。确保你了解隐式和显式等待之间的区别。 (阅读更多内容here in Selenium docs。)您可能需要明确地等待脚本中后续步骤的确切条件。不要,重复不要在测试中使用Thread.Sleep或类似的手动延迟,除非特殊情况。 WebDriver的Wait是一个更好的方法。

+1

谢谢,阿兰!我不是说自动化很容易 - 相反。但是在困难的环境中,我获得了很好的运气,可以获得稳定的高价值自动化工作。 –

+0

对于XPath评论为+1。生成的XPath是最糟糕的选择器 –

1

我最好的答案是添加“可靠性和恢复代码”。例如,也许你的测试试图点击一些东西,但随机的webelement不管出于什么原因都是陈旧的。因此添加捕获StaleElementExceptions的代码并在失败之​​前重试最多5次。

或者,也许有时候,页面加载速度有点太慢,并且在Selenium认为完成之前内容还没有更新(AJAX功能)。这会导致检查失败,但在查看屏幕截图时,页面实际上是正确的,因为这一切发生时间不到0.2秒。因此,在使用断言调用之前添加一个等待内容更新的硒等待。

这实际上给你更可靠的结果,因为你的测试代码现在知道如何处理常见的情况与硒框架。

希望这会有所帮助!

1

我发现Selenium测试经常失败,因为页面元素没有正确加载,即使您已经设置了隐式等待,也可以使用。如果一次测试在同一时间点失败,这对我来说很有用。试试这个(我的代码是C#,但你可以在其他语言中做到这一点):

在测试初始化​​设置等待:

globalWait =新WebDriverWait(驱动程序,TimeSpan.FromSeconds(20));

然后在加载一个麻烦的页面时调用wait: globalWait.Until(ExpectedConditions.ElementIsVisible(By.Id(“myPageElement”)));

这强制等待,直到元素可见。它为我解决了很多问题。通常我将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(); 
} 

我最后的结论是,虽然目前,硒仍然是有点'flakey'。我目前正在试验PhantomJS,但似乎没有更好的。硒是我们拥有的最好的。

相关问题