assertEquals在selenium中工作但在JAVA中不起作用

时间:2015-12-04 16:22:17

标签: java unit-testing selenium selenium-webdriver

我在selenium中制作了一个完美重复的测试用例,然后将其导出到JAVA / JUnit4 / Webdriver:

public void emailInvalid() throws Exception {
    driver.get(baseUrl + "/test/contacts.html");
    driver.findElement(By.name("companyName")).clear();
    driver.findElement(By.name("companyName")).sendKeys("testcomp");
    driver.findElement(By.name("phone")).clear();
    driver.findElement(By.name("phone")).sendKeys("45454545");
    driver.findElement(By.name("email")).clear();
    driver.findElement(By.name("email")).sendKeys("test.ee");
    driver.findElement(By.name("message")).clear();
    driver.findElement(By.name("message")).sendKeys("qwerty");
    driver.findElement(By.cssSelector("button.submit")).click();
    assertEquals("Not valid email.", driver.findElement(By.cssSelector("span.error.notValidEmail")).getText());
}

测试在Java中失败,因为assertEquals无法获取它所寻找的文本。错误消息是

  

org.junit.ComparisonFailure:expected:< [无效的电子邮件]>但是:< []>

4 个答案:

答案 0 :(得分:1)

显然css选择器找不到该元素,因此断言失败。

在执行断言或者根本没有加载元素之后,可能会加载元素。

尝试使用以下代码在断言之前等待元素加载:

function compare(a, b) {
   return a - b;
}

如果不是这种情况,请再次检查选择器是否正确。 还要通过打印实际字符串来检查getText()返回的内容。

答案 1 :(得分:1)

在大多数情况下,您的问题是同步性差。 找到您的元素但其文本为空。 您可以尝试使用webDriverWait并期望stalenessOf,您可以通过在定位器中使用其预期文本来更改元素的定位方式,或者您可以添加非常短的睡眠

答案 2 :(得分:1)

尝试等待文本存在,如果文本位于指定的时间间隔内,则使用断言。 另外,请务必使用css定位器检查元素的唯一性。

public void emailInvalid() throws Exception {
    driver.get(baseUrl + "/test/contacts.html");
    driver.findElement(By.name("companyName")).clear();
    driver.findElement(By.name("companyName")).sendKeys("testcomp");
    driver.findElement(By.name("phone")).clear();
    driver.findElement(By.name("phone")).sendKeys("45454545");
    driver.findElement(By.name("email")).clear();
    driver.findElement(By.name("email")).sendKeys("test.ee");
    driver.findElement(By.name("message")).clear();
    driver.findElement(By.name("message")).sendKeys("qwerty");
    driver.findElement(By.cssSelector("button.submit")).click();
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span.error.notValidEmail")));
    assertTrue(waitForTextPresent(driver, By.cssSelector("span.error.notValidEmail"), "Not valid email.", 20));
}

public static boolean waitForTextPresent(WebDriver driver, By locator, String text, int timeOut) {
    int i = 0;
    int WAIT_SLEEP_INTERVAL = 500;
    boolean isTextPresent = false;
    while (!isTextPresent) {
        i = i + 1;
        try{
             Thread.sleep(WAIT_SLEEP_INTERVAL);
        } catch(Exception e) {
            //do nothing
        }
        isTextPresent = driver.findElement(locator).getText().contains(text);
        if (i * WAIT_SLEEP_INTERVAL >= timeOut) {
            return false;
        }
    }
    return true;
}

实际上你也可以在行之后做一个获取文本:

wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span.error.notValidEmail")));
System.out.println(driver.findElement(By.cssSelector("span.error.notValidEmail")).getText());

看看你是否收到了你要找的文字。在这种情况下,您可能不需要使用方法waitForTextPresent

答案 3 :(得分:0)

尝试检查baseUrl的值。是等于“http://yousite”还是只是“......”等等?尝试调试此方法可能是Java没有找到正确的url。或者使用日志记录和记录baseUrl +“/ test/contacts.html”。看起来像baseUrl的问题。