Перейти к содержимому

Фотография

Обновление DOM


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 13

#1 TorchTT

TorchTT

    Новый участник

  • Members
  • Pip
  • 17 сообщений

Отправлено 19 февраля 2014 - 11:34

Подскажите, пожалуйста, как обновить DOM, без перезагрузки страницы, при помощи Selenium?


  • 0

#2 leipreachan

leipreachan

    Активный участник

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 19 февраля 2014 - 11:41

Подскажите, пожалуйста, как обновить DOM, без перезагрузки страницы, при помощи Selenium?

начнём с начала - а вам для чего?


  • 0

#3 TorchTT

TorchTT

    Новый участник

  • Members
  • Pip
  • 17 сообщений

Отправлено 19 февраля 2014 - 11:43

leipreachan

На странице имеется форма для ввода. После нажатия на кнопку - появляется всплывающее окно с кнопкой и DOM обновляется. Мне необходимо во всплывшем окне нажать на кнопку.


  • 0

#4 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 19 февраля 2014 - 12:10

leipreachan

На странице имеется форма для ввода. После нажатия на кнопку - появляется всплывающее окно с кнопкой и DOM обновляется. Мне необходимо во всплывшем окне нажать на кнопку.

Ройте в сторону driver.getWindowHandles();

 

Только не забудьте сохранить хэндлер основного окна, чтобы после закрытия всплывшего суметь вернуться драйвером на него.


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#5 TorchTT

TorchTT

    Новый участник

  • Members
  • Pip
  • 17 сообщений

Отправлено 19 февраля 2014 - 13:21

Petrov.Sergey

Благодарю за ответ.

 

Если верно понял, то это немного не то - подобные функции позволяют переклчаться между окнами, фреймами и всплывающими окнами.

 

Есть вероятность, что для получения элемента из обновленного DOM необходимо вызвать функцию wait и затем обратиться к интересующему элементу.

 

Тем не менее, код (на Python):

 

WebDriverWait(driver, 10);
driver.find_element_by_xpath("//div[@id='nameId']/div/div[2]").click();
 
Вызывает ошибку:
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"xpath","selector":"//div[@id=\'nameId\']/div/div[2]"}'

 

Как вариант - использовать команду для всплывающего окна :

 

driver.switch_to_alert();

driver.find_element_by_xpath("//div[@id='nameId']/div/div[2]").click()
 
Но она создает ошибку:
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"xpath","selector":"//div[@id=\'nameId\']/div/div[2]"}' ;
 
Если код заменить на:
 

driver.switch_to_alert();

driver.find_elements_by_xpath("//div[@id='nameId']/div/div[2]").click()

 

то появляется ошибка:

AttributeError: 'list' object has no attribute 'click'


  • 0

#6 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 19 февраля 2014 - 13:57

Не важно, на каком языке используется вебдрайвер.

Идея такая:

1) Драйвер смотрит на основное окно

2) Сохраняем хэндлер основного окна.

3) драйвер кликает на кнопочку в основном окне.

4) появилось всплывающее окошко. Но драйвер продолжает смотреть на основное окно.

5) берём хэндлеры всех окон драйверного браузера (их уже два)

6) переключаемся на последний хэндлер (первый - освновное окно, второй - всплывшее). Драйвер смотрит уже на всплывшее окно.

7) драйвер кликает на кнопку во всплывшем окне (стандартный findBy)

8) Всплывшее окно выполнило действие. Драйвер может закрыть окно на которое смотрит (если оно не закрылось) - т.е. всплывшее.

9) Драйвер переключается на сохранённый хэндлер основного окна (потому что после закрытия всплывшего драйвер не смотрит никуда).

10) продолжаем работать драйвером в основном окне.

11) PROFIT!!!


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#7 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 19 февраля 2014 - 14:01

driver.find_element_by_xpath("//div[@id='nameId']/div/div[2]").click()

driver.switch_to_alert();

 

Свич ту алерт переключается на стандартное миниокошко, именуемое "Алерт", которое можно либо сабмитить (нажать "ОК"), либо деклайнить ("Отмена").

Вы же ищете кнопку по ХРАТН. Значит, это не алертное окно, а дочерний процесс, с которым надо работать через хэндлеры.

 

Именно поэтому селениум возвращает ошибку. Драйвер свичнулся на алерт, но ДОМ имеет основного окна, в котором нет кнопки по указанному ХРАТН

Но она создает ошибку:
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"xpath","selector":"//div[@id=\'nameId\']/div/div[2]"}' ;

 

А вот то, что лист не имеет метода клик - это уже ошибка IDE, потому что кликать можно по элементу листа, а не по листу.

Странно, что у Вас вообще получилось запустить этот код (с кликом по листу).


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#8 TorchTT

TorchTT

    Новый участник

  • Members
  • Pip
  • 17 сообщений

Отправлено 19 февраля 2014 - 15:19

Petrov.Sergey

Подскажите, пожалуйста, как сохранять и переключаться между handler'ами?


  • 0

#9 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 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); // переключение на основное окно

  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#10 TorchTT

TorchTT

    Новый участник

  • Members
  • Pip
  • 17 сообщений

Отправлено 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 "не видит" всплывшее окно?


  • 0

#11 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 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 "не видит" всплывшее окно?

 

Попробуйте воспользоваться вот этой ссылкой. Может, поможет?


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#12 TorchTT

TorchTT

    Новый участник

  • Members
  • Pip
  • 17 сообщений

Отправлено 20 февраля 2014 - 08:15

Вопрос решен.

Всплывающее окно оказалось просто новым элемент в HTML-тэге исходной страницы.

Для обращения к элементу появившегося окна необходимо выполнить (XPath изменен на корректный):

time.sleep(10)
driver.find_element_by_xpath("//div[@class='nameId']/div[@sbisname='Ok']/div").click();

За решение спасибо Petrov.Sergey


  • 0

#13 leipreachan

leipreachan

    Активный участник

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 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, реализованном через вёрстку :)


  • 0

#14 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 21 февраля 2014 - 05:54

тогда я искренне вам рекомендую подучить терминологию.

Всплывающее окно - это новое окно браузера. Вы говорили о каком-то popup, реализованном через вёрстку :)

 

Это да. Я тоже понял, что речь идёт не о новом процессе и не о попапе, только тогда, когда сам увидел страничку сайта и "всплывающее окошко".

Ничё. Разобрались :)

 

Я надеюсь, топикстартер усвоил важность правильного определения сути проблемы.


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных