在树莓派无头环境中使用Selenium

19 投票
3 回答
27591 浏览
提问于 2025-04-18 15:16

这是我第一次尝试在树莓派上使用Iceweasel浏览器运行Selenium。今晚我做了一个简单的测试。

# selenium test for /mod2 
# verify: posts, and page name
class TestMod2Selenium(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

    def test_validate_page_elements(self):
        driver = self.driver
        driver.get("127.0.0.1:5000/mod2")
        self.assertIn("Home - microblog", driver.title)
    def tearDown(self):
        self.driver.close()

运行时我遇到的错误是:

=====================================================================
ERROR: test_validate_page_elements (__main__.TestMod2Selenium)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 58, in setUp
    self.driver = webdriver.Firefox()
  File "/home/pi/naughton_python/flask/flask/local/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__
    self.binary, timeout),
  File "/home/pi/naughton_python/flask/flask/local/lib/python2.7/site-packages/selenium/webdriver/firefox/extension_connection.py", line 47, in __init__
    self.binary.launch_browser(self.profile)
  File "/home/pi/naughton_python/flask/flask/local/lib/python2.7/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 61, in launch_browser
    self._wait_until_connectable()
  File "/home/pi/naughton_python/flask/flask/local/lib/python2.7/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 100, in _wait_until_connectable
    self._get_firefox_output())
WebDriverException: Message: "The browser appears to have exited before we could connect. The output was: ERROR: ld.so: object 'x_ignore_nofocus.so' from LD_PRELOAD cannot be preloaded: ignored.\nERROR: ld.so: object 'x_ignore_nofocus.so' from LD_PRELOAD cannot be preloaded: ignored.\nERROR: ld.so: object 'x_ignore_nofocus.so' from LD_PRELOAD cannot be preloaded: ignored.\nError: no display specified\n"

根据我在网上看到的,Iceweasel在树莓派上是Firefox的替代品,很多人说只需要调用Firefox的webdriver就可以使用它。我是不是做错了什么?

谢谢你的时间。

3 个回答

1

我在看@fivef的回答,之后在编译geckodriver以适应新版Firefox时遇到了很多麻烦,所以我决定试试chomedriver和chromium,结果发现真的很简单:

sudo apt-get install chromium-chromedriver xvfb python-pip
sudo pip install pyvirtualdisplay selenium

然后在Python中:

from selenium import webdriver
from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

driver = webdriver.Chrome()
1

我不太确定为什么会发生这个问题,但你遇到的错误和Firefox驱动使用“原生事件”来模拟用户操作(比如键盘、鼠标等)有关。

如果你想了解一些技术细节和关于原生事件的背景信息,可以查看这个链接: https://code.google.com/p/selenium/wiki/NativeEventsOnLinux

很多使用selenium的人(包括我自己)发现“原生事件”在很多情况下会出现问题,因此使用“合成事件”会更简单和安全。合成事件是通过JavaScript来模拟用户的操作。

所以,试着在你的驱动中禁用原生事件(通过设置配置文件属性),这样你就可以解决这个错误了。

示例:

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.native_events_enabled = False
driver = webdriver.Firefox(profile)
# synthesized events are now enabled for this 
# driver instance... native events are disabled.
39

在没有显示器的树莓派上,这个方法对我有效:

安装步骤:

sudo apt-get install python-pip iceweasel xvfb
sudo pip install pyvirtualdisplay selenium

代码:

from selenium import webdriver
from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

driver = webdriver.Firefox()

撰写回答