Selenium支持无头浏览器测试吗?

73

我目前正在研究Selenium Server,但似乎没有支持无头浏览器测试的驱动程序。

除非我弄错了,它不支持。如果您在X上,可以创建虚拟帧缓冲区以隐藏浏览器窗口,但那并不是真正的无头浏览器。

有人能启迪我一下吗?Selenium是否支持无头浏览器测试?

12个回答

19

你不需要将PhantomJS作为Selenium的替代方案。Selenium包含一个基于GhostDriver平台的PhantomJS webdriver类。只需要在计算机上安装PhantomJS二进制文件即可。在Python中,然后可以使用以下代码:

from selenium import webdriver
dr = webdriver.PhantomJS() 

大功告成。


使用Python和PhantomJS进行无头Selenium测试 - https://realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/ - fragles
4
不要使用PhantomJS,它不是非常可靠。人们应该使用Xvfb来运行Chrome或Firefox。 - ffxsam
3
更新:鉴于Chrome 51的“--headless”标志,PhantomJS不再受支持。 - Jay Wick

15

WebDriver API支持使用HTMLUnit作为浏览器进行测试。Ruby开发者一直在使用Capybara进行无界面的Selenium测试,因此这是完全可行的。


抱歉,这里让我有点困惑——Selenium和WebDriver之间有什么区别? - Chris
1
有关Selenium和WebDriver的详细描述,请参阅Ross Patterson在https://dev59.com/9Gw05IYBdhLWcg3w11Qk#6996322上的回答。 - Craig Delthony
1
虽然这是一个老问题,但如果您能编辑您的答案并包括PhantomJS,那将非常好。 - Arpit Rai

11

我知道这是一篇旧文章。我认为它会帮助其他正在寻找答案的人。

您可以使用XVFB在任何Linux发行版中安装完整的Firefox浏览器。这确保了您的测试是在真正的浏览器中进行的。一旦您有了无头设置,您可以使用您选择的Webdriver连接并运行测试。


7

我注意到您说使用X framebuffer不是真正的无头解决方案,但对于大多数人来说,我认为这将是可接受的。此外,如果您对此解决方案感兴趣,这个服务将帮助您实现。


7

无头浏览器是一个不好的想法。它们可以为您提供一些测试,但远不及真正用户所看到的内容,并且掩盖了只有真正浏览器才会遇到的许多问题。在无头环境(如 Windows 或带有 XVFB 的 Linux)上使用“有头”浏览器(即除 HTMLUnit 之外的任何浏览器)要好得多。


16
不,你希望实现持续集成,所以无头模式只是逻辑上的问题。为什么要掩盖问题呢?无头模式只是意味着不使用图形设备。 - Roland Kofler
1
@Roo 在这里已经明确表示:“_你可以创建一个虚拟帧缓冲区来隐藏浏览器窗口,但那并不是真正的无头浏览器_”,他并不是指“_没有使用图形设备_”。事实上,你和我都同意 - 在没有显示器的情况下运行真正的浏览器就可以解决问题。 - Ross Patterson
1
@Roo,我曾经看到过无头测试失败的情况,但实际上Web应用程序在所有浏览器中都能正常工作,代码也没有问题。而且我也曾经看到过无头测试成功的情况,但实际上Web应用程序至少在某些浏览器中是有问题的。我不信任无头测试。它们或许比没有好,但应该与针对所涉及Web应用程序最“重要”浏览器的自动化测试相结合。 - KajMagnus
@KajMagnus 我曾经看到在xvfb上的“无头”测试失败,但在实际的图形环境中它们可以正常工作。这只是在webdriver发展的这个阶段必须要使用的痛苦。有很多错误,很多头痛,没有真正的替代方案... - antimatter

2
Selenium确实以某种方式支持无头浏览器测试。 Docker Selenium由SeleniumHQ维护。这些Docker容器默认带有xvfb支持。您可以将PhantomJS等工具与Selenium连接在一起。但是,这并不是Selenium官方支持的。

就像其他人描述的那样,PhantomJS并不是真正推荐的。Selenium的整个意义在于自动化浏览器。但是为什么要自动化一个没有人使用的浏览器呢?我从来没有理解开发人员经常会忽视这一点..


2
是的。Selenium支持无头浏览器测试,这样做更快速、更方便,特别是在执行大量测试用例时。
ChromeOptions cromeOptions = new ChromeOptions();

//Location of browser binary/.exe file
cromeOptions.setBinary("/usr/bin/google-chrome-stable");

cromeOptions.addArguments("--headless");
cromeOptions.addArguments("--no-sandbox");
cromeOptions.addArguments("--disable-gpu");
cromeOptions.addArguments("--window-size=1920,1080");

WebDriver webDriver = new ChromeDriver(cromeOptions);

0
使用 Ruby 和 macOS: brew install phantomjs 然后:
driver = Selenium::WebDriver.for :phantomjs

0

以下是有关如何在运行Django/Python的Ubuntu Linux环境中使用Selenium、xvfb和Firefox驱动程序的“现代答案”:

# install xvfb and Firefox driver
sudo su
apt-get install -y xvfb firefox
wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
tar -x geckodriver -zf geckodriver-v0.19.1-linux64.tar.gz -O > 
/usr/bin/geckodriver
chmod +x /usr/bin/geckodriver

# install pip modules
pip install selenium
pip install PyVirtualDisplay

然后,您可以按照Django LiveServerTestCase说明进行操作。

要使用刚安装的驱动程序,请执行以下操作:

from pyvirtualdisplay import Display
from selenium.webdriver.firefox.webdriver import WebDriver

driver = WebDriver(executable_path='/usr/bin/geckodriver')
display = Display(visible=0, size=(800, 600)).start()

# add your testing classes here...

driver.quit()
display.stop()

0

在 Linux 服务器上安装 chromeDrivergoogle-chrome-stable 版本,以便触发测试,并将相同的二进制文件添加到您的代码中。

代码片段:

private static String driverPath = "/usr/bin/chromedriver";
static
{
    System.setProperty("webdriver.chrome.driver", driverPath);
    options = new ChromeOptions();
    options.setBinary("/usr/bin/google-chrome-stable");
    options.addArguments("headless");
    driver = new ChromeDriver(options);
}

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