DeprecationWarning: использовать setter для свойства без заголовка вместо set_headless opts.set_headless (headless = True) с использованием Geckodriver и Selenium в Python - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть очень простой скрипт Python, который отлично работает на моем локальном компьютере (Mint 19), но не работает на удаленном компьютере (Ubuntu 16.04). Те же файлы, оба Python 3.7. У меня есть geckodriver в / usr / local / bin, и он проверяет путь с помощью gecko --version из командной строки. Я не могу понять, в чем проблема. Файл geckodriver.log просто говорит:

1541268536111   mozrunner::runner   INFO    Running command: "/usr/bin/firefox" "-marionette" "-headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile.Mt6zAyZc7D01"
*** You are running in headless mode.
1541268546125   Marionette  INFO    Listening on port 33632

Ошибка с терминала:

root@dev1:/home/krypterro/PycharmProjects/corbot# python3 test1.py
 2018-11-03 12:28:22,442 -  INFO -  Application - Start
test1.py:12: DeprecationWarning: use setter for headless property instead of set_headless
  opts.set_headless(headless=True)
Traceback (most recent call last):
  File "test1.py", line 21, in <module>
    main()
  File "test1.py", line 14, in main
    driver = webdriver.Firefox(options=opts)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
    keep_alive=True)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: timed out

Вот код Python:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


def main():
    logging.info('Application - Start')
    # Operate in headless mode
    opts = Options()
    opts.set_headless(headless=True)
    assert opts.headless
    driver = webdriver.Firefox(options=opts)
    driver.get("https://www.krypterro.com")
    html_src = driver.page_source
    print(html_src)
    driver.close()
    driver.quit()
    logging.info('Application - End')
main()

У меня разрешен порт 4444 в брандмауэре на удаленном компьютере, но так как это локальное-локальное соединение, я не уверен, что это должно иметь значение.

1 Ответ

0 голосов
/ 03 ноября 2018

Журнал этой информации ...

INFO - Application - Start test1.py:12: DeprecationWarning: use setter for headless property instead of set_headless opts.set_headless(headless=True)

... подразумевает, что set_headless opts.set_headless(headless=True) является устаревшим , и вы должны использовать setter для свойства без заголовка следующим образом:

opts = Options()
opts.headless = True
driver = webdriver.Firefox(options=opts)
driver.get("https://www.krypterro.com")

Подробное обсуждение вы можете найти в Как программно обезглавить Firefox в Selenium с помощью Python?

Продвигаясь вперед, когда вы пытаетесь получить Источник страницы и, поскольку веб-приложение имеет JavaScript , вам нужно вызвать WebDriverWait и вы можете использовать следующее решение:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://www.krypterro.com")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h2[contains(.,'Products and Services')]")))
    html_src = driver.page_source
    print(html_src)
    driver.quit()

Примечание B : вам не нужно вызывать driver.close() и driver.quit(), а всегда вызывать driver.quit() только в методе tearDown(){}, чтобы закрыть и уничтожить WebDriver и Веб-клиент экземпляров изящно.

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