弃用警告:在 Python 中使用 Geckodriver 和 Selenium 将 setter 用于无头属性而不是 set_headless opts.set_headless(headless=

Posted

技术标签:

【中文标题】弃用警告:在 Python 中使用 Geckodriver 和 Selenium 将 setter 用于无头属性而不是 set_headless opts.set_headless(headless=True)【英文标题】:DeprecationWarning: use setter for headless property instead of set_headless opts.set_headless(headless=True) using Geckodriver and Selenium in Python 【发布时间】:2019-04-07 15:02:48 【问题描述】:

我有一个非常基本的 Python 脚本,可以在我的本地机器(Mint 19)上完美运行,但在远程机器(Ubuntu 16.04)上却失败了。相同的文件,都是 Python 3.7。我在 /usr/local/bin 中有 geckodriver,它使用命令行中的 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,但由于它是本地到本地连接,我不确定这是否重要。

【问题讨论】:

该弃用警告与之后的 WebDriverException 无关.. 【参考方案1】:

此信息日志...

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")

可以在How to make firefox headless programmatically in Selenium with python?找到详细讨论

在您尝试检索 Page Source 时继续前进,并且由于 Web Application 已启用 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(),而是始终仅在 tearDown() 方法中调用 driver.quit() 来关闭和销毁 WebDriver em> 和 Web 客户端 实例。

【讨论】:

虽然避免弃用代码是个好主意,但弃用警告只是对 stderr 的警告打印机。 OP 的堆栈跟踪显示在那之后发生的实际错误.. 添加了无头的修复,警告消失了,谢谢。但我仍然遇到同样的错误,它仍然崩溃。 @krypterro 查看我更新的答案并告诉我状态 我将问题缩小到特定 VPS 服务器上的一些奇怪的网络问题,我启动了一个新盒子,上面的代码有效,现在不会抛出错误。谢谢。

以上是关于弃用警告:在 Python 中使用 Geckodriver 和 Selenium 将 setter 用于无头属性而不是 set_headless opts.set_headless(headless=的主要内容,如果未能解决你的问题,请参考以下文章

弃用警告:executable_path 已被弃用 selenium python

弃用警告:在 Python 中使用 Geckodriver 和 Selenium 将 setter 用于无头属性而不是 set_headless opts.set_headless(headless=

Python 3 pyplot.hold 已弃用

弃用警告:无效的转义序列 - 用啥代替 \d?

Django 中的详细弃用警告

scikit-learn GridSearchCV 弃用警告