硒声明存在和不存在的元素

时间:2018-12-24 13:53:41

标签: java selenium testng assertion webdriverwait

我有登录表单,我需要使用正确和错误的凭据对其进行测试。

在输入登录名和密码后,单击“登录”按钮,网站将对其进行处理10秒钟。

如果凭据确定,将显示mainPage.menu WebElement。

如果凭据错误-不显示mainPage.menu WebElement。 登录页面可能会刷新,或者(并非总是)会显示错误消息。

如何在测试中检查它?

要获得正确的凭据,请进行测试:

http://<user_gitlab>@ip_gitlab_server/example.git

对于错误的凭据,测试失败并带有异常,因为无法建立mainPage.menu:

Assert.assertEquals(true, mainPage.menu.isDisplayed());

如果我插入“断言”“登录”按钮,则测试将始终成功,因为在任何情况下(任何凭据)在开始的10秒钟内都会显示“登录”。 当然,如果我将Thread.sleep放入,它将解决问题。 但是,这不是一个好习惯。

2 个答案:

答案 0 :(得分:1)

问题在这里

Assert.assertEquals(false, mainPage.menu.isDisplayed());

如果凭据错误,则mainPage.menu将不可用,这将导致异常。因此需要处理。请使用try/catch

boolean displayed=false;

    try {
        mainPage.menu.isDisplayed();
        displayed=true;
    }catch (Exception e) {
        //element not displayed
        //displayed is false
    }

Assert.assertEquals(false, mainPage.menu.isDisplayed());

答案 1 :(得分:1)

尽管此答案将满足您的要求,但理想情况下,有效无效登录名应在单独的测试用例中进行验证。此外,避免引用诸如 true 在<{3}}下为 mainPage.menu 的项目。

理想的验证候选者可以是:

  • 有效登录名:欢迎消息
  • 无效的登录名:错误消息

根据您的用例,您需要按以下步骤引入try-catch{}块:

try{
    Assert.assertEquals(true, <placeholder_of_welcome_message>.isDisplayed());
}catch (NoSuchElementException e) {
    Assert.assertEquals(true, <placeholder_of_error_message>.isDisplayed()); 
}

此外,您可能需要按以下步骤诱导 WebDriverWait

try{
    Assert.assertEquals(true, new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.id("welcome_message_element_id"))));
}catch (NoSuchElementException e) {
    Assert.assertEquals(true, new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.id("error_message_element_id")))); 
}