无法在我的网页中测试错误消息

时间:2016-07-25 05:40:50

标签: java selenium selenium-webdriver

我有一个包含多个字段的网页。在那里,我有几个必填字段,如果我输入更新按钮而不输入必填字段,它必须显示错误。所以现在我想测试一下是否会出现特定的错误信息,然后我还要测试剩余的字段。

这是我的代码:

public class TestProfileCompanyDetailsPage 
{
    WebDriver driver;
    @Test
    public void verifyProfileCompanyDetailsPage() throws Exception
    {
        driver = DriverInIt.getInstance().getDriver();

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        LoginIntoVendors login=PageFactory.initElements(driver, LoginIntoVendors.class);

        login.verifyLoginVendors();

        VendorsHomePageApp vhpapp=PageFactory.initElements(driver, VendorsHomePageApp.class);

        vhpapp.clickOnProfileTab();

        ProfileCompanyDetailsPage proCompDetPage=PageFactory.initElements(driver, ProfileCompanyDetailsPage.class);

        proCompDetPage.clickOnCompDetEdit();

        proCompDetPage.clickAndEnterCompName("IBM");

        proCompDetPage.clickOnUpdateButton();

       }

    public boolean IsTestElementPresent(WebDriver driver)
    {
        try
        {
            driver.findElement(By.xpath("html/body/section/div/div/div[1]/div[3]/p[2]/span"));
            return true;
        }
        catch(NoSuchElementException e)
        {
            return false;
        }
    }



}

以下是Page:

enter image description here

HTML code:

<p class="mB10px" style="padding-left: 20%;">
<button class="btn btn-success" style="width: 120px;" ng-click="saveVendor(1)" ng-class="{"cbc-btn-spin":persist==1}">Update</button>
<span class="btn-link mL5px vBot pointer" ng-click="cancelVendor(1)">Cancel</span>
</p>
<p class="mB10px show" ng-class="{"show":uiVendorError1.length>0}" style="display: none; padding-left: 20%;">
<span class="error ng-binding" ng-bind="uiVendorError1">Please enter Company Description</span>
</p>
<p class="mB10px" ng-class="{"show":uiVendorSuccess1.length>0}" style="display: none; padding-left: 20%;">
<span class="greenC ng-binding" ng-bind="uiVendorSuccess1"/>
</p>

2 个答案:

答案 0 :(得分:2)

// do stuff to cause the error message to show up
Assert.assertTrue(driver.findElement(By.xpath("//*[text()='Please enter Company Description']")).isDisplayed());

在上面,如果错误消息不在那里,它会抛出异常。但是,这并不是很好,因为错误可能需要一段时间才能在验证后弹出,并且您的测试可能已经过测试以确定它是否存在。更好的解决方案是使用Web驱动程序等待并检查它是否在预期的时间段内可见。此外,请注意,如果错误消息具有ID,则选择该文件比使用匹配XPath的文本要好得多。更好的例子:

// do stuff to cause the error message to show up
new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[text()='Please enter Company Description']")));

这将等到错误消息可见(该元素为其true方法返回isDisplayed)。如果它在10秒内无法显示,则会抛出TimeoutException。请注意,这只是如何检查元素的一个示例,通常最好在测试中捕获该异常,并使用更好,更具描述性的错误消息使断言失败。

要检查多个字段,只需使用您希望它们匹配的各种字符串调用的辅助方法,并使用变量而不是硬编码应匹配的文本。如果文本有任何引号(单引号或双引号),也要小心,因为这可能导致无效的XPath。

答案 1 :(得分:1)

在这种情况下,您应该尝试使用ExpectedConditions等待您的元素包含一些带有自定义public boolean IsTestElementPresent(WebDriver driver) { try { WebDriverWait wait = new WebDriverWait(driver, 10); return wait.until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { WebElement el = d.findElement(By.cssSelector("span.error.ng-binding")); return (el.getText().length() > 0); } }); }catch(TimeoutExceptione e) { return false; } } 的文字,如下所示: -

public boolean IsTestElementPresent(WebDriver driver)
{
    try
    {
       WebDriverWait wait = new WebDriverWait(driver, 10);

       wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(., 'Please enter Company Description')]")));

       return true;

    }catch(TimeoutExceptione e)
    {
        return false;
    }
}

已修改: - 如果您想获取包含错误消息的元素,请尝试以下操作: -

{{1}}

希望它有所帮助.. :)