Selenium webdriver:验证页面中的多个文本

时间:2017-09-30 15:17:25

标签: selenium-webdriver nosuchelementexception

我有一个页面,可以在表单提交中提供三条消息中的任何一条(错误,警告和成功)。

问题是,一次只能显示一条消息,其余的消息我将得到“NoSuchElementException'。

我目前的代码是:

String expectedWarningMessage = new String("Product details already present");
String expectedErrorMessage = new String("Case Id already exists. Please use 'Search DOA return form' to modify authorization details.");
String expectedSuccessMessage = new String("The DOA Authorisation has been sent successfully.");

String actualWarningMessage = getWebElement("apj.newdoa.warning.message").getText().trim();         
String actualErrorMessage = getWebElement("apj.newdoa.error.message").getText().trim();    
String actualSuccessMessage = getWebElement("apj.newdoa.success.message").getText().trim();

if (actualWarningMessage.equalsIgnoreCase(expectedWarningMessage)) {
        logger.info("success");
        getWebElement("apj.newdoa.warning.yesbutton").click();
}else if(actualErrorMessage.equalsIgnoreCase(expectedErrorMessage)) {
        logger.info("fail");
}else if (actualSuccessMessage.equalsIgnoreCase(expectedSuccessMessage)) {
        logger.info("success");
} else {
        logger.info("Something went Wrong");
}

请注意,所有三个文本都出现在DOM的不同位置,因此文本的定位器不同。

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。一种方法是使用许多人经常建议的try-catch。这不是最佳实践,建议在Selenium Java文档中使用。

另一种方法是使用driver.findElements()并检查集合是否为空以确定元素是否存在。这是Selenium Java docs中推荐的方法。

  

不应该使用findElement来查找不存在的元素,使用findElements(By)并断言零长度响应。

您的具体案例采用了一种更有效的方法。由于您的CSS选择器是"apj.newdoa.*.message"格式,因此您可以跳过指示消息类型的类,并始终查找消息元素。这使我们可以避免检测特定错误消息元素3次。在这种情况下,我们可以使用"apj.newdoa.message"并始终查找消息。在我们找到message元素之后,我们需要确定它包含哪个类,因为它指示消息类型:成功,警告或错误。我们可以通过拉class属性并进行文本搜索来完成此操作。一旦我们完成了所有这些操作,我们就会知道要发送哪条消息,然后只需Assert它的预期价值。 (注意:Assert类来自JUnit和TestNG,请参阅下面的#3。)

WebElement e = driver.findElement(By.cssSelector("apj.newdoa.message"));
if (e.getCssValue("class").contains("success"))
{
    expectedMessage = expectedSuccessMessage;
}
else if (e.getCssValue("class").contains("warning"))
{
    expectedMessage = expectedWarningMessage;
}
else if (e.getCssValue("class").contains("error"))
{
    expectedMessage = expectedErrorMessage;
}
else
{
    Assert.fail("The expected message was not found");
}

Assert.assertEquals(expectedMessage, e.getText().trim(), "Verify expected message");

补充几点。

  1. 没有必要将已知字符串传递给String()构造函数,它已经是String,只需分配它,例如

    String expectedWarningMessage = "Product details already present";
    
  2. 不要创建一个函数来获取元素。没有必要。

    getWebElement("apj.newdoa.warning.yesbutton");
    

    不比

    更有效率
    driver.findElement(By.cssSelector("apj.newdoa.warning.yesbutton"));
    

    但是在你的情况下你必须编写包装函数,然后确保它不包含错误。更不用说,使用您的代码的任何人都必须学习您的API而不是提供的标准Selenium API。如果您必须具有该功能,则应接受By课程而不是String课程,以便更灵活(不仅限于CSS选择器而且您不必解析字符串以确定它是什么类型或测试我见过的人们试图做的所有不同的方法等。)

    WebElement getWebElement(By locator)
    {
        return driver.findElement(locator);
    }
    
  3. 不要编写自己的日志记录机制。使用现有的经过测试的库之一,如JUnit或TestNG。它们具有很多功能并且可靠,因为很多人都使用它们。

答案 1 :(得分:-1)

如果你坚持自己的逻辑,一种方法可能是#34;用getWebElement - try包裹你的catch并抓住NoSuchElementException

String actualWarningMessage;
try
{ 
    actualWarningMessage  = getWebElement("apj.newdoa.warning.message").getText().trim();         
}
catch(NoSuchElementException e)
{
}
相关问题