27

我正尝试使用python中的selenium来使用javascript来刮取一些动态页面。但是,在我遵循pypi页面上的硒指令(http://pypi.python.org/pypi/selenium)之后,我无法调用firefox。我在AWS ubuntu 12.04上安装了firefox。我得到的错误信息是:无法从AWS上的python中调用selenium的firefox

In [1]: from selenium import webdriver 

In [2]: br = webdriver.Firefox() 
--------------------------------------------------------------------------- 
WebDriverException      Traceback (most recent call last) 
/home/ubuntu/<ipython-input-2-d6a5d754ea44> in <module>() 
----> 1 br = webdriver.Firefox() 

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout) 
    49   RemoteWebDriver.__init__(self, 
    50    command_executor=ExtensionConnection("127.0.0.1", self.profile, 
---> 51    self.binary, timeout), 
    52    desired_capabilities=DesiredCapabilities.FIREFOX) 
    53 

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.pyc in __init__(self, host, firefox_profile, firefox_binary, timeout) 
    45   self.profile.add_extension() 
    46 
---> 47   self.binary.launch_browser(self.profile) 
    48   _URL = "http://%s:%d/hub" % (HOST, PORT) 
    49   RemoteConnection.__init__(

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in launch_browser(self, profile) 
    42 
    43   self._start_from_profile_path(self.profile.path) 
---> 44   self._wait_until_connectable() 
    45 
    46  def kill(self): 

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in _wait_until_connectable(self) 
    79     raise WebDriverException("The browser appears to have exited " 
    80      "before we could connect. The output was: %s" % 
---> 81      self._get_firefox_output()) 
    82    if count == 30: 
    83     self.kill() 

WebDriverException: Message: 'The browser appears to have exited before we could connect. The output was: Error: no display specified\n' 

我没有在网络上搜索,发现这个问题发生的与其他人(https://groups.google.com/forum/?fromgroups=#!topic/selenium -users/21sJrOJULZY)。但如果是这样,我不明白解决方案。

谁能帮助我吗?谢谢!

+4

'错误:未指定显示“表示浏览器没有显示其主窗口的屏幕。您需要找到一种运行Firefox无头的方法:http://stackoverflow.com/questions/10060417/python-firefox-headless。这个答案特别看起来很有用:http://stackoverflow.com/a/6300672/464744 – Blender

+0

@Blender非常感谢你。第二个链接解决了我的问题。有时候,如果我没有正确的关键字,我就无法从google找到解决方案。 – David

+0

@Blender:你是如何在网页中获得锚点以便在页面中响应的?我在页面中看不到像这样的链接。 –

回答

51

问题是Firefox需要显示器。我在示例中使用了pyvirtualdisplay来模拟显示。解决的办法是:

from pyvirtualdisplay import Display 
from selenium import webdriver 

display = Display(visible=0, size=(1024, 768)) 
display.start() 

driver= webdriver.Firefox() 
driver.get("http://www.somewebsite.com/") 

<---some code---> 

#driver.close() # Close the current window. 
driver.quit() # Quit the driver and close every associated window. 
display.stop() 

请注意,pyvirtualdisplay需要以下后端之一:Xvfb来,Xephyr,Xvnc的。

这应该可以解决您的问题。

+0

谢谢。一个简单的问题:driver.close()和driver.quite()有什么区别? – David

+1

帮助未来的人们偶然发现这一点..请注意区分关闭/退出@ That1Guy的评论显然是错误的。还要注意他的答案中的代码从未正确关闭底层驱动程序,并可能泄漏进程或文件描述符。 'driver.close()'只是关闭当前窗口。它会让其他窗口打开并且驱动程序处于活动状态。 'driver.quit()'实际上会退出驱动程序并关闭每个关联的窗口。 如果您想了解更多关于差异的细节,请阅读selenium webdriver源代码。 –

+1

给未来读者的一封信:@CoreyGoldberg所说的评论其实是不正确的。我不仅困惑了我提到的Selenium的方法,而且还困惑于当时正在研究的另一个项目。请参考['driver.quit()']的文档(http://selenium-python.readthedocs.org/api.html?highlight=driver.quit#selenium.webdriver.firefox.webdriver.WebDriver.quit)和['drver.close()'](http://selenium-python.readthedocs.org/api.html?highlight=driver.close#selenium.webdriver.remote.webdriver.WebDriver.close)。 – That1Guy

4

我也遇到了同样的问题。我在Firefox 47和Selenium 2.53上。所以我所做的就是将Firefox降级到45。

1)删除Firefox的47首:

sudo apt-get purge firefox

2)检查可用的版本:

apt-cache show firefox | grep Version

它会显示可用的Firefox版本,如:

Version: 47.0+build3-0ubuntu0.16.04.1

Version: 45.0.2+build1-0ubuntu1

3)告诉其构建下载

sudo apt-get install firefox=45.0.2+build1-0ubuntu1

4)接下来,您必须不再次升级到新版本。

sudo apt-mark hold firefox

5)如果你想升级后

sudo apt-mark unhold firefox sudo apt-get upgrade

希望这有助于。

相关问题