【问题标题】:assertEquals works in selenium but not in JAVAassertEquals 在 selenium 中有效,但在 JAVA 中无效
【发布时间】:2016-03-09 15:36:09
【问题描述】:

我在 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: 预期: 但原为:

【问题讨论】:

  • 检查是否只有一个与此类选择器相关的元素存在,并且它在出现后立即预期文本,并且稍后不会生成文本。另外,请确保此文本确实位于此元素中,而不是任何子元素中
  • @Gadget 它在元素中,我认为这是因为 selenium 在单击提交时使用 clickandWait 但在 JAVA 中它只是单击并且加载速度不够快,因此 assertEqual 为空!我尝试了下面的 mike88 代码,但它只是超时了。
  • 我认为你的意思是它与 Selenium IDE 一起工作,但一旦你将它移植到 Selenium WebDriver/Java 就不能工作。您可能想在问题中澄清这些细节。
  • 您应该花一些时间调查您的.getText() 为何返回""。您可能需要添加WebDriverWait
  • 请提供 html 代码....其中显示“无效电子邮件”文本..

标签: java unit-testing selenium selenium-webdriver


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("span.error.notValidEmail")));
    assertEquals("Not valid email.", driver.findElement(By.cssSelector("span.error.notValidEmail")).getText());
    

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

    【讨论】:

    • 如果找不到元素,则抛出 ElementNotFoundException
    【解决方案3】:

    尝试等待文本出现,如果文本位于指定的时间间隔内,则使用断言。 还要确保使用您的 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;
    }
    

    其实你也可以在行后做一个get text:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-12-09
        • 1970-01-01
        • 2021-01-22
        • 2022-10-01
        • 2018-09-11
        • 1970-01-01
        • 2018-12-26
        • 2023-03-08
        • 2018-03-07
        相关资源
        最近更新 更多