Selenium WebDriver:Firefox启动,但不打开URL

15

我刚刚第一次安装了Selenium,但我开始使用时遇到了问题。

使用pip进行安装很顺利:

pip install selenium

我可以在Python中使用import selenium

现在我正在尝试运行以下示例脚本:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title

发生的情况是Firefox打开了,但它没有导航到“http://www.python.org”(类似于此问题中所描述的行为 - 它只显示一个空白页面)。

大约60秒钟后,会出现以下异常:

Traceback (most recent call last):
  File "selenium-test.py", line 4, in <module>
    driver = webdriver.Firefox()
  File "/home/usr1/.local/lib/python2.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 61, in __init__
    desired_capabilities=capabilities)
  File "/home/usr1/.local/lib/python2.6/site-packages/selenium/webdriver/remote/webdriver.py", line 72, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/home/usr1/.local/lib/python2.6/site-packages/selenium/webdriver/remote/webdriver.py", line 114, in start_session
    'desiredCapabilities': desired_capabilities,
  File "/home/usr1/.local/lib/python2.6/site-packages/selenium/webdriver/remote/webdriver.py", line 165, in execute
    self.error_handler.check_response(response)
  File "/home/usr1/.local/lib/python2.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 136, in check_response
    raise exception_class(value)
selenium.common.exceptions.WebDriverException: Message: u'<HTML><HEAD>\r\n<TITLE>Network Error</TITLE>\r\n</HEAD>\r\n<BODY>\r\n<FONT face="Helvetica">\r\n<big><strong></strong></big><BR>\r\n</FONT>\r\n<blockquote>\r\n<TABLE border=0 cellPadding=1 width="80%">\r\n<TR><TD>\r\n<FONT face="Helvetica">\r\n<big>Network Error (tcp_error)</big>\r\n<BR>\r\n<BR>\r\n</FONT>\r\n</TD></TR>\r\n<TR><TD>\r\n<FONT face="Helvetica">\r\nA communication error occurred: "Operation timed out"\r\n</FONT>\r\n</TD></TR>\r\n<TR><TD>\r\n<FONT face="Helvetica">\r\nThe Web Server may be down, too busy, or experiencing other problems preventing it from responding to requests. You may wish to try again at a later time.\r\n</FONT>\r\n</TD></TR>\r\n<TR><TD>\r\n<FONT face="Helvetica" SIZE=2>\r\n<BR>\r\nFor assistance, contact your network support team.\r\n</FONT>\r\n</TD></TR>\r\n</TABLE>\r\n</blockquote>\r\n</FONT>\r\n</BODY></HTML>'

以下是软件版本:

  • Firefox ESR 17.0.5
  • Selenium (Python bindings) 2.35.0
  • Python 2.6.6
  • Red Had Linux 6.3
  • 已安装“Firefox WebDriver 2.35.0”浏览器扩展程序

运行本地Web服务器,然后尝试获取http://localhost。根据您的网络设置,可能会出现代理配置问题。 - Marwan Alsabbagh
当您正常启动Firefox并访问python.org时会发生什么?这样可以工作吗? - Marwan Alsabbagh
我曾经遇到过同样的问题,但是Selenium已经是最新版本了,Firefox也是如此,并且设置网络代理也没有帮助。我在Github上的Selenium问题页面上看到了一条注释: “FIREFOX 48+仅与GECKODRIVER兼容。任何在此处记录的48+问题都将被关闭为#2559的重复项。” 然后我把Firefox从49降级到了45,它很好用。我认为这个“Geckodriver”是现在的解决方案。 - mpiskore
4个回答

5

好的,在搜索了一段时间后,我发现通常问题是Selenium中存在一个错误(可能性较小),或者是代理问题。但是,没有任何建议如何解决代理问题的答案似乎起作用。

最终,我找到了解决方法:您需要在所有地方取消所有代理设置(环境变量,以及 - 在我的情况下这是问题 - 在Gnome上)。稍后,当您创建WebDriver时,您需要传递一个配置文件,该配置文件将浏览器代理设置为您实际使用的设置(在我的情况下是自动配置URL)

1) 取消 http_proxy 环境变量(由 urllib 使用)

export http_proxy=

2) 清除Gnome代理设置: 系统 --> 首选项 --> 网络代理 --> 选择"直接连接互联网"

3) 使用配置了代理的Firefox配置文件(在这种情况下是自动代理配置)启动webdriver.Firefox()

fp = webdriver.FirefoxProfile()
# Here "2" stands for "Automatic Proxy Configuration"
fp.set_preference("network.proxy.type", 2)
fp.set_preference("network.proxy.autoconfig_url",
                  "http://proxy-address-here:8080/") 
driver = webdriver.Firefox(firefox_profile=fp)

webdriver.Proxy类怎么样?看起来你可以将其设置为空白。如果我错了,请纠正我。根据你的示例,我发现Python WebDriver比非官方的PHP版本要好得多。开箱即用。 - m3nda
如果您正在使用Selenium 4.0.0,则第1点非常重要,即使您已设置no_proxy = localhost-请参见https://github.com/SeleniumHQ/selenium/issues/9925。 - Cito

2

需要升级selenium,如果你正在使用最新版本的Firefox浏览器,则应该使用最新版本的selenium。

对于Python,请输入以下命令

pip install -U selenium

对于Java,删除旧的jar并从这里下载最新版本http://www.seleniumhq.org/download/,然后将其附加到构建路径中。它会正常工作。享受使用Firefox进行测试吧!


0
请尝试关闭本地主机(127.0.0.1)Web服务器,如果您在通常的端口80上运行任何服务器。
如果有本地主机服务器正在运行,则Firefox二进制文件不允许您加载配置文件。
请参见selenium\webdriver\firefox\firefox_binary.py中的第81行,该行指向is_connectable(self)函数/方法。
def is_connectable(self):

    """Trys to connect to the extension but do not retrieve context."""
    try:
        socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket_.settimeout(1)
        socket_.connect(("127.0.0.1", self.profile.port))
        socket_.close()
        return True
    except socket.error:
        return False

GLHF


-1

指出在哪里下载不同版本并不是非常有帮助,特别是对于一个较旧的问题,它可能无法与新版本一样正常工作。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接