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

Java 无法测试我的网页中的错误消息,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我有一个包含多个字段的网页。在那里,我有几个必填字段,如果我输入更新按钮而不输入必填字段,它必须显示一个错误。所以现在我想测试是否有特定的错误消息,然后我还要测试其余的字段 这是我的代码: public class TestProfileCompanyDetailsPage { WebDriver driver; @Test public void verifyProfileCompanyDetailsPage() throws Exception {

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

这是我的代码:

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;
        }
    }



}
<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>
这是页面:

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;
        }
    }



}
<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>

HTML代码:

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;
        }
    }



}
<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>

更新 取消

请输入公司说明


在这种情况下,您应该尝试使用
WebDriverWait
等待,直到您的元素具有一些自定义
预期条件的文本,如下所示:-

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;
    }
}

希望对您有所帮助:)

在这种情况下,您应该尝试使用
WebDriverWait
等待,直到您的元素具有一些自定义
预期条件的文本,如下所示:-

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;
    }
}
希望有帮助……)

在上面的示例中,如果错误消息不在那里,它将抛出异常。但是,这不是很好,因为验证后可能需要一些时间才能弹出错误,并且您的测试可能已经测试过了,以查看是否存在错误。更好的解决方案是使用web驱动程序等待并检查它是否在预期的时间段内可见。另外,请注意,如果错误消息有一个ID,那么选择该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']")));
这将等待直到错误消息可见为止(元素对于其
isDisplayed
方法返回
true
)。如果在
10
秒内它不可见,则将抛出
TimeoutException
。请注意,这只是一个如何检查元素的示例,在测试中捕获该异常并使用更好、更具描述性的错误消息进行断言失败通常是最佳做法

要检查多个字段,只需将其设置为一个helper方法,并使用期望匹配的组合字符串调用该方法,并使用一个变量,而不是硬编码应该匹配的文本。如果文本中有任何引号(单引号或双引号),也要小心,因为这可能导致XPath无效

在上面的示例中,如果错误消息不在那里,它将抛出异常。但是,这不是很好,因为验证后可能需要一些时间才能弹出错误,并且您的测试可能已经测试过了,以查看是否存在错误。更好的解决方案是使用web驱动程序等待并检查它是否在预期的时间段内可见。另外,请注意,如果错误消息有一个ID,那么选择该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']")));
这将等待直到错误消息可见为止(元素对于其
isDisplayed
方法返回
true
)。如果在
10
秒内它不可见,则将抛出
TimeoutException
。请注意,这只是一个如何检查元素的示例,在测试中捕获该异常并使用更好、更具描述性的错误消息进行断言失败通常是最佳做法


要检查多个字段,只需将其设置为一个helper方法,并使用期望匹配的组合字符串调用该方法,并使用一个变量,而不是硬编码应该匹配的文本。如果文本中有任何引号(单引号或双引号),也要小心,因为这可能会导致XPath无效。

那么这有什么问题??有什么例外吗??而且还需要共享错误消息部分的HTML代码没有例外,我有公司名称和描述字段,我想在点击更新按钮后测试这两个字段的错误消息。上面的代码只是一次,我应该在这里停止这个测试用例,但我需要继续测试。是否有其他方法来测试这些部分。@sandepkumar-错误消息的html代码please@nullpointer-是的,附件。那有什么问题??有什么例外吗??而且还需要共享错误消息部分的HTML代码没有例外,我有公司名称和描述字段,我想在点击更新按钮后测试这两个字段的错误消息。上面的代码只是一次,我应该在这里停止这个测试用例,但我需要继续测试。是否有其他方法来测试这些部分。@sandepkumar-错误消息的html代码please@nullpointer-是的,附件。假设这是“公司名称”字段,好的,我需要继续测试“说明”字段的意思。希望你们能理解。假设这是一个“公司名称”字段好,我需要继续测试的意思是测试“描述”字段。希望你能理解。