【问题标题】:splinter: how to add chrome options?splinter:如何添加 chrome 选项?
【发布时间】:2016-06-08 08:14:09
【问题描述】:

我在linux下使用splinter(v0.7.3)进行web测试,而在chrome上,默认示例代码无法运行:

from splinter import Browser
from pyvirtualdisplay import Display

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

b = Browser('chrome')
b.visit('http://www.google.com')
b.quit()

d.stop()

在运行时,我得到了这样的异常:

selenium.common.exceptions.WebDriverException: Message: chrome not reachable

我在 selenium 中测试了相同的功能,并添加了一些 chrome 选项:

from selenium import web driver
from selenium.webdriver.chrome.options import Options
from pyvirtualdisplay import Display

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

opt = Options()
opt.add_argument('--disable-setuid-sandbox')
b = webdriver.Chrome(chrome_options=opt)
b.get('http://www.google.com')
b.quit()

d.stop()

这个没问题,区别是chrome驱动中添加了--disable-setuid-sandbox选项,如果不添加选项,chromium-browser下会有一个僵尸chrome-sandbox进程。

这里的问题是,我不知道如何将chrome.options.Option实例传递给splinter.Browser(),我浏览了splinter/driver/webdriver/chrome.py下的实现,似乎没有将这样的实例传递给@987654330的入口@。还有其他方法可以将选项传递给 chrome 驱动程序吗?

【问题讨论】:

    标签: selenium selenium-chromedriver splinter


    【解决方案1】:

    创建BaseWebDriver 的新实例并使用Chrome 驱动程序实例设置.driver。这个例子启动 Chrome 最大化:

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    from splinter.driver.webdriver import BaseWebDriver, WebDriverElement
    
    options = Options()
    options.add_argument('--start-maximized')
    
    browser = BaseWebDriver()
    browser.driver = Chrome(chrome_options=options)
    
    browser.visit('https://www.google.com')
    

    【讨论】:

    • 有趣,但我试过了,但我遇到了烦人的问题,绝望地寻找一种控制 Chrome 语言的方法,因为 chromedriver 没有定义定义的偏好。我的 ubuntu 语言环境是法语,所以就像 chrome 安装时使用法语作为默认语言,我无法从 splinter 中控制它,这使我的测试失败......
    【解决方案2】:

    我能做到这一点的唯一方法是使用add_argument 方法和selenium.webdriver.ChromeOptions,如下所示:

    from selenium.webdriver import ChromeOptions
    from splinter import Browser
    
    chrome_options = ChromeOptions()
    chrome_options.add_argument(your_argument)
    
    b=Browser("chrome", options=chrome_options)
    b.visit('http://www.google.com')
    b.quit()
    

    所以在你的代码中是:

    from splinter import Browser
    from selenium.webdriver import ChromeOptions
    from pyvirtualdisplay import Display #I'm not certain what this is...
    
    d = Display(visible=0, size=(800, 600))
    d.start()
    
    chrome_options = ChromeOptions()
    chrome_options.add_argument('disable-setuid-sandbox')
    
    b = Browser('chrome')
    b.visit('http://www.google.com')
    b.quit()
    
    d.stop()
    

    注意:我无法用你的论点对此进行测试,因为我最近破坏了我的 GRUB,所以我被困在 Windows 中,而 disable-setuid-sandbox 选项仅限于 linux。但是,我一直在使用这种方法和 headless 参数。

    【讨论】:

      【解决方案3】:

      我不能 100% 确定这会起作用,但我只是查看了 splinter 的文档,上面写着。

      您还可以传递与 Selenium DesiredCapabilities 参数相对应的其他参数。

      查看调用浏览器的 Splinter 的源代码可以接受一些参数。然后将传递这些参数以创建 Chrome WebDriver 的实例。于是我去看了selenium的源代码,看到构造函数是这样的:

      def __init__(self, executable_path="chromedriver", port=0,
                       chrome_options=None, service_args=None,
                       desired_capabilities=None, service_log_path=None):
      

      chrome_options 有一个参数,所以应该可以使用这个参数来传递它。因此,如果我是正确的,这应该可以正常工作:

      opt = Options()
      opt.add_argument('--disable-setuid-sandbox')
      b = Browser(browser='chrome', chrome_options=opt)
      

      编辑 或者,您也可以将选项作为所需的功能传递:

      opt = Options()
      opt.add_argument('--disable-setuid-sandbox')
      dc = opt.to_capabilities()
      b = Browser(browser='chrome', desired_capabilities=dc)
      

      【讨论】:

      • 你能给我看看链接吗?我搜索了 splinter doc,有一个 desired_capabilities,但仅适用于 firefox,不幸的是,chrome_options 不适用于我当前的 splinter 版本(0.7.3)。
      • @coanor 它在 Remote WebDiver 的文档中 (splinter.readthedocs.io/en/latest/drivers/remote.html) 我认为它与 Chrome WebDriver 没有什么不同,因为它都创建了同一个 Browser 类的实例。你试过我的建议了吗?
      • @coanor 这是浏览器类github.com/cobrateam/splinter/blob/master/splinter/browser.py的源代码。如您所见,它只不过是创建了一个 ChromeWebDriver 并传递了 *args 和 **kwargs。这意味着您可以传递 selenium WebDriver 使用的参数,这里是github.com/SeleniumHQ/selenium/blob/master/py/selenium/…
      • 0.7.3(github master分支版本)下,没有chrome_options这个参数,任何额外的参数都会导致语法错误,请看github的源码
      • @coanor 哦,我知道我犯了一个错误,因为它没有调用 selenium WebDriver,它调用了分裂 WebDriver。给我一点时间,我看看能不能找到办法。
      【解决方案4】:

      过去几周我一直在研究一个分支,如果你愿意,可以查看我的开发分支。我已添加此功能和其他功能。

      选项可以作为列表传递给chrome_options参数

      from splinter import Browser
      
      options = ['--start-maximized', '--disable-setuid-sandbox']
      
      with Browser('chrome', chrome_options=options) as browser:
          browser.visit('http://www.google.com')
      

      编辑:

      所以事实证明,splinter 一直以来都可以使用 **kwargs 将各种可用选项传递给 selenium 驱动程序。例如:

      from splinter import Browser
      
      options = {'chrome_options':['--start-maximized', '--disable-setuid-sandbox']}
      
      with Browser('chrome', **options) as browser:
          browser.visit('http://www.google.com')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 2012-03-06
        • 2014-09-24
        • 1970-01-01
        • 2022-06-17
        相关资源
        最近更新 更多