Java-导航到具有相同html模板的其他页面时断言一个类包含文本

时间:2018-10-23 08:45:52

标签: java selenium automation

我正在从一页导航到另一页。它们都使用相同的模板,唯一的区别是.image-header__title类中包含的文本。 我想选择链接导航到另一页,并断言使用.gettext()到达了正确的页面,如下所示:

@Test
public void When_I_Click_patterns_page_is_returned() {
    driver.get("https://test.co.uk/fabric-range/");
    String actualString = fp.ClickPattern().getText();
    assertTrue(actualString.contains("Semi-plain Fabrics"));
}


public WebElement ClickPattern() {
    driver.findElement(By.cssSelector(".image-blocks .image-blocks__items .image-blocks__item:nth-child(7) a")).sendKeys(Keys.ENTER);

    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(20, TimeUnit.SECONDS)
            .pollingEvery(1, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);

    WebElement fabricType = wait.until(driver -> driver.findElement(By.cssSelector(".image-header__inner .image-header__content .image-header__title")));

    return fabricType;
}

我正在等待.image-header__title出现,但是由于此元素位于初始登录页面上,因此getText()方法不是从第二页返回文本,而是从第一页返回文本。

无论如何,在执行getText()方法之前,我是否可以等待第二页加载?

2 个答案:

答案 0 :(得分:0)

您知道您的应用程序是否在“ sendKeys(Keys.ENTER)”上重新加载页面,还是只是重新呈现HTML?此外,即使它确实重新加载了页面,后期加载事件是否也用于通过javascript生成HTML?

Selenium仅在页面加载时阻塞,因此,如果“ sendKeys(Keys.ENTER)”触发javascript重新呈现HTML,则它将不等待该过程完成,而是立即返回,并且结果表现出您看到的行为。

纯粹出于调试目的(!!!!!),您是否尝试过在“ sendKeys(Keys.ENTER)”和“ Webdriver wait”之间添加几秒钟的睡眠?假设这样做确实会导致返回更新后的文本,那么这确认您的应用程序没有重新加载,只是在重新呈现HTML。

还有其他诸如页面加载指示器之类的测试可以替代吗?如果有的话,您的“等到”将一直循环直到不显示加载指示符。一旦退出,您就可以继续知道您的页面已准备好与之交互。

答案 1 :(得分:0)

是,请使用ExpectedConditions#stalenessOf

  1. 获取对第1页上的元素的引用,e
  2. 触发更改页面的操作
  3. 等待e过时
  4. 继续第2页上的脚本

public WebElement ClickPattern() {
    WebElement e = driver.findElement(By.cssSelector(".image-blocks .image-blocks__items .image-blocks__item:nth-child(7) a"));
    e.sendKeys(Keys.ENTER);
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.stalenessOf(e));

    return wait.until(ExpectedCondition.visibilityOfElementLocated(By.cssSelector(".image-header__inner .image-header__content .image-header__title")));
}

我认为您不需要第二次等待...但是您可以将它留在里面。