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

Фотография

Selenium: PhantomJS не находит элемент по XPATH

PhantomJS Selenium Python

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

#1 cenzor

cenzor

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

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Ломаков Константин Александрович

Отправлено 09 ноября 2017 - 00:50

Всем привет.

Что уж греха таить, живой пример - инстаграм: необходимо добавить комментарий. В windows7+python3.6.2+selenium+geckodriver ищу элемент (сердечко для "лайка") по XPATH:

heart = driver.find_elements_by_xpath('//a[contains(@class, "_eszkz _l9yih")]')

- находит.

Ищу элемент (строку для добавления комментария) по XPATH:

comment = driver.find_elements_by_xpath('//textarea[@placeholder = "Add a comment..."]')

- находит.

Соответственно, в обоих случаях возвращается массив найденных элементов (на практике в массиве всего 1 элемент), обращаюсь к нему comment[0].send_keys(comment_text) и т. д.

В целом, всё работает.

Переношу всё на debian8+python3.4+selenium+PhantomJS. Код прежний, ищу элемент (сердечко для "лайка") по XPATH:

heart = driver.find_elements_by_xpath('//a[contains(@class, "_eszkz _l9yih")]')

- находит.

Ищу элемент (строку для добавления комментария) по XPATH:

comment = driver.find_elements_by_xpath('//textarea[@placeholder = "Add a comment..."]')

не находит.

Ставлю print(len(comment)) показывает 0. Соответственно, при обращении comment[0].send_keys(comment_keys) вываливается:

IndexError: list index out of range

 

1) Почему XPATH для "лайка" он находит, а для комментария - нет?

2) Если элемент по XPATH не найден, не должен ли он выбрасывать соответствующее исключение? Почему этого не происходит?


  • 0

#2 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 09 ноября 2017 - 08:33

А вы попробуйте взять html открытой страницы в PhantomJS и посмотреть есть ли там этот элемент.

Браузеры могут отрабатывать по разному, особенно такие старые. Используйте Chrome headless.


  • 2

#3 cenzor

cenzor

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

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Ломаков Константин Александрович

Отправлено 10 ноября 2017 - 03:56

А вы попробуйте взять html открытой страницы в PhantomJS и посмотреть есть ли там этот элемент.

Браузеры могут отрабатывать по разному, особенно такие старые. Используйте Chrome headless.

Спасибо.

Действительно, в page_source нет данного элемента, в PhantomJS страница по-другому представлена.

 

Что бы в будущем не было похожих проблем, я обратил внимание на Chrome headless, который вы указали.

Я установил google-chrome-stable, в код добавил:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)

При запуске открывается Chrome с такой надписью и ничего не происходит:

(не получается вставить изображение, см. прикреплённый скриншот)

Trace:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/telebot/util.py", line 58, in run
    task(*args, **kwargs)
  File "instabot.py", line 63, in instagram_com
    driver.get("https://www.instagram.com")
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 320, in get
    self.execute(Command.GET, {'url': url})
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"29592.1","isDefault":true},"id":1,"name":"","origin":"://"}
  (Session info: chrome=62.0.3202.89)
  (Driver info: chromedriver=2.9.248304,platform=Linux 3.16.0-4-amd64 x86_64)

я даже пробовал с такими аргументами:

options = webdriver.ChromeOptions()
options.add_argument('window-size=1200x600')
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--disable-web-security')
driver = webdriver.Chrome(chrome_options=options)

результат тот же.

 

Хотел бы заметить, что в некоторых источниках аргументы указываются без двойного тире, а где-то с двойным тире, как правильно?

Ещё иногда встречается вот такая опция:

options.setBinary("/path/to/other/chrome/binary")

Для чего она нужна?

Прикрепленные файлы

  • Прикрепленный файл  chrome.JPG   31,71К   0 Количество загрузок:

  • 0

#4 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 10 ноября 2017 - 09:10

Тут пишут что надо без --

https://intoli.com/b...eadless-chrome/

 

оставьте пока только disable-gpu и headless, если заработает.ю то добавьте установку размера окна.

 

options.setBinary("/path/to/other/chrome/binary") - нужно для указания места хрома, если он установлен в нестандартное место (вам это не надо).

 

и вы не указали какой версии вы используете Селениум.

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


  • 1

#5 cenzor

cenzor

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

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Ломаков Константин Александрович

Отправлено 10 ноября 2017 - 11:46

Тут пишут что надо без --

https://intoli.com/b...eadless-chrome/

 

оставьте пока только disable-gpu и headless, если заработает.ю то добавьте установку размера окна.

 

options.setBinary("/path/to/other/chrome/binary") - нужно для указания места хрома, если он установлен в нестандартное место (вам это не надо).

 

и вы не указали какой версии вы используете Селениум.

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

 

Selenium 3.7.0

ChromeDriver (v2.9.248304), поставил новый - 2.33. Запускает!

Спасибо большое!!!


  • 0



Темы с аналогичным тегами PhantomJS, Selenium, Python

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

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