Я написал тест с использованием webdrive, как это:
//put stuff in the database
fillDatabaseWithParticipants();
WebDriver driver = new FirefoxDriver();
doLogin(driver);
//finds the search button and clicks it
WebElement searchButton = driver.findElement(By.xpath("/html/body/div/div[8]/div[2]/form/table/tbody/tr[5]/td/button"));
searchButton.click();
//clicks the first column of a Primefaces dataTable component to order the content in ascending order
driver.findElement(By.xpath(("/html/body/div/div[8]/div[2]/form/div/div/table/thead/tr/th"))).click();
//gets the first table division of the first table row
WebElement firstTableDivision = driver.findElement(By.xpath("/html/body/div/div[8]/div[2]/form/div/div/table/tbody/tr/td"));
Assert.assertEquals("Should be the same name", "A name inserted by me in the database", firstTableDivision.getText());
Что тест делает, так это открывает браузер Firefox, заходит на сайт и входит в систему. Затем он нажимает кнопку поиска на странице и ждет появления данных. Когда появляется таблица данных с результатами, тест щелкает первый столбец, чтобы упорядочить его в порядке возрастания. Затем он делает assertEquals()
, чтобы увидеть, действительно ли первое имя является первым (то, которое я вставил в базу данных в начале теста).
У меня проблема в том, что этот тест работает, только если я запускаю его в режиме отладки. Если я запускаю его с помощью теста Run As ... jUnit в Eclipse, возвращаемое значение firstTableDivision.getText()
будет первым содержимым, которое было у деления таблицы, когда оно впервые отображалось.
Я пытался использовать ExpectedCondition
примерно так:
ExpectedCondition e = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
WebElement changingElement = d.findElement(By.xpath("/html/body/div/div[8]/div[2]/form/div/div/table/tbody/tr/td"));
System.out.println(changingElement.getText());
if(changingElement.getText().equalsIgnoreCase("A Name inserted by me")){
return true;
} else {
return false;
}
}
};
org.openqa.selenium.support.ui.Wait<WebDriver> w = new WebDriverWait(driver, 15);
w.until(e);
, а также пытался driver.manage().timeouts().implicitlyWait(new Long(15), TimeUnit.SECONDS);
.
Ожидаемое состояние, которое я написал, ужасно, я знаю, но было только посмотреть, сработает ли оно. Результат с этими 2 методами был одинаковым. Возвращаемое значение - это имя, которое было у dataTable, когда оно было впервые отображено.
Я искал проблему такого рода и обнаружил, что это, вероятно, условие гонки между FirefoxDriver и DOM в браузере.
Мне было интересно, было ли у простых лиц какое-либо событие, которое я мог бы прослушать, чтобы поместить его в ExpectedCondition
, чтобы закончить состояние гонки, но не смог найти ничего подобного.
Что вы, ребята, думаете, я должен сделать? Мне не хватает решения для этого?