Подскажите, пожалуйста, как обновить DOM, без перезагрузки страницы, при помощи Selenium?
Обновление DOM
#1
Отправлено 19 февраля 2014 - 11:34
#2
Отправлено 19 февраля 2014 - 11:41
Подскажите, пожалуйста, как обновить DOM, без перезагрузки страницы, при помощи Selenium?
начнём с начала - а вам для чего?
#3
Отправлено 19 февраля 2014 - 11:43
На странице имеется форма для ввода. После нажатия на кнопку - появляется всплывающее окно с кнопкой и DOM обновляется. Мне необходимо во всплывшем окне нажать на кнопку.
#4
Отправлено 19 февраля 2014 - 12:10
На странице имеется форма для ввода. После нажатия на кнопку - появляется всплывающее окно с кнопкой и DOM обновляется. Мне необходимо во всплывшем окне нажать на кнопку.
Ройте в сторону driver.getWindowHandles();
Только не забудьте сохранить хэндлер основного окна, чтобы после закрытия всплывшего суметь вернуться драйвером на него.
#5
Отправлено 19 февраля 2014 - 13:21
Благодарю за ответ.
Если верно понял, то это немного не то - подобные функции позволяют переклчаться между окнами, фреймами и всплывающими окнами.
Есть вероятность, что для получения элемента из обновленного DOM необходимо вызвать функцию wait и затем обратиться к интересующему элементу.
Тем не менее, код (на Python):
Как вариант - использовать команду для всплывающего окна :
driver.switch_to_alert();
driver.switch_to_alert();
то появляется ошибка:
AttributeError: 'list' object has no attribute 'click'
#6
Отправлено 19 февраля 2014 - 13:57
Не важно, на каком языке используется вебдрайвер.
Идея такая:
1) Драйвер смотрит на основное окно
2) Сохраняем хэндлер основного окна.
3) драйвер кликает на кнопочку в основном окне.
4) появилось всплывающее окошко. Но драйвер продолжает смотреть на основное окно.
5) берём хэндлеры всех окон драйверного браузера (их уже два)
6) переключаемся на последний хэндлер (первый - освновное окно, второй - всплывшее). Драйвер смотрит уже на всплывшее окно.
7) драйвер кликает на кнопку во всплывшем окне (стандартный findBy)
8) Всплывшее окно выполнило действие. Драйвер может закрыть окно на которое смотрит (если оно не закрылось) - т.е. всплывшее.
9) Драйвер переключается на сохранённый хэндлер основного окна (потому что после закрытия всплывшего драйвер не смотрит никуда).
10) продолжаем работать драйвером в основном окне.
11) PROFIT!!!
#7
Отправлено 19 февраля 2014 - 14:01
driver.switch_to_alert();
Свич ту алерт переключается на стандартное миниокошко, именуемое "Алерт", которое можно либо сабмитить (нажать "ОК"), либо деклайнить ("Отмена").
Вы же ищете кнопку по ХРАТН. Значит, это не алертное окно, а дочерний процесс, с которым надо работать через хэндлеры.
Именно поэтому селениум возвращает ошибку. Драйвер свичнулся на алерт, но ДОМ имеет основного окна, в котором нет кнопки по указанному ХРАТН
А вот то, что лист не имеет метода клик - это уже ошибка IDE, потому что кликать можно по элементу листа, а не по листу.
Странно, что у Вас вообще получилось запустить этот код (с кликом по листу).
#8
Отправлено 19 февраля 2014 - 15:19
#9
Отправлено 19 февраля 2014 - 19:48
Petrov.Sergey
Подскажите, пожалуйста, как сохранять и переключаться между handler'ами?
На питоне - не знаю.
На жаве как-то так:
String mainWindow = driver.getWindowHandle(); // хэндлер основного окна List<String> windows = new ArrayList<String>(driver.getWindowHandles()); // список хэндлеров всех драйверных окон driver.switchTo().window(windows.get(1)); // переключение на второе окно driver.close(); // закрытие активного окна (второго) driver.switchTo().window(mainWindow); // переключение на основное окно
#10
Отправлено 19 февраля 2014 - 20:22
При наличии всплывшего окна после ввода команды:
str = driver.window_handles[0]; print (str);
выводится
"{18674a3e-ccf9-4e24-9040-ad0227c162ce}"
Тем не менее, если изменить код:
str = driver.window_handles[1]; print (str);
то отображается ошибка:
"IndexError: list index out of range"
Я верно понял, что Selenium "не видит" всплывшее окно?
#11
Отправлено 20 февраля 2014 - 03:33
При наличии всплывшего окна после ввода команды:
str = driver.window_handles[0]; print (str);выводится
"{18674a3e-ccf9-4e24-9040-ad0227c162ce}"
Тем не менее, если изменить код:
str = driver.window_handles[1]; print (str);то отображается ошибка:
"IndexError: list index out of range"
Я верно понял, что Selenium "не видит" всплывшее окно?
Попробуйте воспользоваться вот этой ссылкой. Может, поможет?
#12
Отправлено 20 февраля 2014 - 08:15
Вопрос решен.
Всплывающее окно оказалось просто новым элемент в HTML-тэге исходной страницы.
Для обращения к элементу появившегося окна необходимо выполнить (XPath изменен на корректный):
time.sleep(10) driver.find_element_by_xpath("//div[@class='nameId']/div[@sbisname='Ok']/div").click();
За решение спасибо Petrov.Sergey
#13
Отправлено 20 февраля 2014 - 09:27
Вопрос решен.
Всплывающее окно оказалось просто новым элемент в HTML-тэге исходной страницы.
Для обращения к элементу появившегося окна необходимо выполнить (XPath изменен на корректный):time.sleep(10) driver.find_element_by_xpath("//div[@class='nameId']/div[@sbisname='Ok']/div").click();За решение спасибо Petrov.Sergey
тогда я искренне вам рекомендую подучить терминологию.
Всплывающее окно - это новое окно браузера. Вы говорили о каком-то popup, реализованном через вёрстку :)
#14
Отправлено 21 февраля 2014 - 05:54
тогда я искренне вам рекомендую подучить терминологию.
Всплывающее окно - это новое окно браузера. Вы говорили о каком-то popup, реализованном через вёрстку :)
Это да. Я тоже понял, что речь идёт не о новом процессе и не о попапе, только тогда, когда сам увидел страничку сайта и "всплывающее окошко".
Ничё. Разобрались :)
Я надеюсь, топикстартер усвоил важность правильного определения сути проблемы.
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных