WebDriver в Selenium будет «кешировать» результат выбора? - PullRequest
0 голосов
/ 18 ноября 2011

Используя Selenium WebDriver в Sun JDK 1.6, я PageObject предоставляю такой метод

public void function selectDate()
{
     //The HTML Calendar element should be already opened by the caller. 

     //Line X
     this.driver.findElement(By.cssSelector(/*Selector Statement*/)).click();
     //Will cause the founded element disappeared.
}

И я бы хотел, чтобы этот метод был повторным. Это означает, что я могу вызывать его много раз в методе вызова:

public void function caller()
{
     this.driver.findElement(By.
         cssSelector(/*Selector for showing the HTML Calendar*/)).click();
     po.selectDate();

     this.driver.findElement(By.
         cssSelector(/*Selector for showing the ANOTHER Calendar*/)).click();      
     po.selectDate();
}

Но возникнет исключение

Element is not currently visible and so may not be interacted with;
(... Stack trace...)
    at Line X

Трассировка стека показывает, что ошибка вызвана строкой X в методе selectDate().
Если я вызову метод selectDate() только один раз, исключение не будет выдано.

Единственная причина, по которой я могу догадаться, заключается в том, что WebDriver будет «кэшировать» результаты выбора, поэтому, если я выберу тот же элемент, используя тот же селектор CSS, он найдет старый и исчезнувший. Я прав ? Или я кое-что пропустил?

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Если вы всегда используете один и тот же By.cssSelector(/*Selector Statement*/) в selectDate(), вы всегда выбираете один и тот же элемент.CBRRacer и я предполагаем, что вы ожидаете, что ваш оператор выбора будет каким-то образом зависеть от того, какой календарь вы выбрали, но это не так, как работают селекторы.Поэтому, если селектор для части первого календаря, он выйдет из строя во второй раз, а если для второго, то он выйдет из строя в первый.

0 голосов
/ 18 ноября 2011

Самым простым способом обработки этого является поиск отображаемого свойства.

public void function selectDate()
{
     //The HTML Calendar element should be already opened by the caller. 

     //Line X
     WebElement thisElement = driver.findElement(By.cssSelector(/*Selector Statement*/));
     if(thisElement.Displayed)
     {
      thisElement.click();
     }
     //Will cause the founded element disappeared.
}

Я предполагаю, что когда вы заставляете Предмет исчезать, элемент не удаляется из домена, он просто скрыт (display: none или show: false). Это означает, что селен все еще может найти элемент, но он просто не может взаимодействовать с ним. Так что, если вы проверите для отображения, вы знаете, что вы можете взаимодействовать с ним.

Другой вариант - перехватить ваши селекторы в списке или массиве и проанализировать список или массив.

...