WebDriver / Selenium 2 неправильно находит текст тега в компоненте простых лиц - PullRequest
0 голосов
/ 11 мая 2011

Я написал тест с использованием 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, чтобы закончить состояние гонки, но не смог найти ничего подобного.

Что вы, ребята, думаете, я должен сделать? Мне не хватает решения для этого?

1 Ответ

0 голосов
/ 15 мая 2011

Пытались ли вы отключить «добавление идентификатора» в форме?

<h:form id="myForm" prependId="false">

Отключив это, вы добьетесь того, чтобы получить идентификаторы, назначенные вами для элементов формы.Может быть, это может помочь.Привет.

...