Selenium 2 WebDriver не оценивает обновленный DOM должным образом

Я использую Selenium 2 WebDriver в С# для автоматизации страницы ввода. Существует элемент управления сводкой проверки, который скрыт при загрузке модели DOM. Вот как это выглядит при дополнительной нагрузке.

<div id='validation_summary' style='display: none'>
  <div id='validation_message'/>

Когда мой pageObject инициализируется в Selenium, для свойства Displayed WebElement устанавливается значение «false». Этого я и ожидал.

После нажатия кнопки отправки dom меняется на:

<div id='validation_summary' style='display: block'>
  <div id='validation_message'>
     <div><a>Fix Me</a></div>
  </div>

Когда я пытаюсь получить доступ к WebElement следующим образом, после того, как выдается щелчок для проверки, свойство Displayed по-прежнему имеет значение «false», а добавленный div не отображается:

var validation = new WebDriverWait(_driver, TimeSpan.FromSeconds(10)).Until<IWebElement>((d)=>d.FindElement(By.Id('validation_message'));

Должно ли это на самом деле работать? Должен ли я ожидать, что Selenium будет достаточно сообразительным, чтобы оценить DOM в его текущем состоянии? Как он на самом деле оценивает свойство Displayed элемента? Если я посмотрю на свойство PageSource, я увижу, что текст присутствует. Я не понимаю, почему я не вижу, чтобы мои изменения отражались в Selenium.


person duckus    schedule 24.08.2012    source источник
comment
ты уже пробовал запускать? Не вижу проблем с логикой. Я думаю, это во многом зависит от специфики вашей страницы. Вопрос о том, как долго виден новый ‹div›, является довольно важной проблемой. Проверяли ли вы с помощью средства просмотра DOM, какое значение было установлено для скрытого свойства и сколько времени требуется, чтобы оно стало видимым? Возможно, селен слишком быстро находит элемент прямо перед тем, как он станет видимым. Попробуйте написать метод wait_for_visible(), который должен вам помочь.   -  person Greg    schedule 24.08.2012
comment
Кажется, я пытался дождаться, пока он станет видимым, но время ожидания истекло. Я попробую это снова.   -  person duckus    schedule 24.08.2012


Ответы (2)


Попробуй это:

var scripter = driver as JavaScriptExecutor;

var result = scripter.ExecuteScript("return $('#validation_message').is(':hidden');").ToString();
if (result.ToLower().Equals("true"))
{
//Do your stuff
}

И не стесняйтесь использовать JavaScript. По моему скромному мнению, в Selenium все еще недостаточно инструментов, поэтому вы можете реализовать свои собственные, просто используя javaScript.

person Frigik    schedule 31.08.2012

Да, мой ответ использует псевдокод Java, но Selenium достаточно умен, чтобы всегда получать последнюю версию элемента. Во время этого цикла экземпляр WebElement будет продолжать обновляться, поэтому он не устарел:

@FindBy( id = 'validation_message')
public WebElement validatorMessageElement;
...
PageFactory.initObjects()
...
for ( infiniteLoop ) {
   boolean isThere = validatorMessageElement.isDisplayed();
   sleep(1 second);
}
person djangofan    schedule 20.02.2016