【问题标题】:How to read preferences, get value of profile setting from Selenium Firefox webdriver via geckodriver?如何读取首选项,通过 geckodriver 从 Selenium Firefox webdriver 获取配置文件设置的值?
【发布时间】:2019-06-01 13:33:40
【问题描述】:

我可以使用set_preference 设置偏好,例如:

profile = selenium.webdriver.FirefoxProfile()
profile.set_preference('permissions.default.image', 2)

但是,我不知道如何读取设置的当前值?

【问题讨论】:

    标签: python selenium firefox geckodriver selenium-firefoxdriver


    【解决方案1】:

    它们在default_preferences 实例属性中:

    print(profile.default_preferences)
    

    看代码,是字典。

    【讨论】:

    • 它没有在默认的 selenium FF 配置文件 (webdriver_prefs.json) 中定义,因此您在初始设置之前看不到它。默认值为True
    【解决方案2】:

    如果您正在寻找未在 selenium 中公开的首选项/设置(它从文件“webdriver_prefs.json”中加载它,该文件具有它实际需要/可以控制的那些),那么您可以获得它来自 about:config 页面本身。

    免责声明 - 此方法使用可能在未来版本中更改的 Firefox js 对象 - 因此停止工作。

    想法是——打开“about:config”,搜索key,获取它的值。如果您手动执行此操作,您会发现这不是您通常使用的常规 html 页面 - 它是一个充满命名空间等的 xml。然而,数据存储在一个 js 对象 view

    所以流程是 - 打开配置页面,通过 JS 完成所有工作:

    from selenium import webdriver
    
    
    def get_preference(name):
        """ Runs a JS that a) sets the value of the searched-for setting to the name argument,
            b) looks for the value of the first element in the "table" below.
            Thus the name better be exact, and you'd better be looking for the 1st match :) """
    
        global driver
        value = driver.execute_script("""
            document.getElementById("textbox").value = arguments[0];
            FilterPrefs();
            view.selection.currentIndex = 0;
            var value = view.getCellText(0, {id:"valueCol"});
            return value;
        """, name)
        return value
    
    
    if __name__ == '__main__':
        try:
            ff_profile = webdriver.FirefoxProfile()
            ff_profile.set_preference("general.warnOnAboutConfig", False)  # there's a nasty warning opening about:config (another setting not present in the selenium preferences ;)
    
            driver = webdriver.Firefox(firefox_profile=ff_profile)
            driver.get('about:config')
            print(get_preference('devtools.jsonview.enabled'))
        finally:
            driver.quit()
    

    【讨论】:

    • 看看我的另一个答案(以及这个答案的第一句)——Selenium 处理的偏好是 a)有限集,b)只是一个简单的 python 字典。 python 中的公理是没有setter/getter——而只是从对象本身获取值;正如您在代码中看到的那样,set_preference() 非常简单 - 它只是将值分配给键,在同一个 default_preferences 字典中。
    • 想一想,我认为您遇到的真正麻烦是“为什么 selenium 没有 get_preference() 方法 - 将返回 every在浏览器中设置,永远。”。如果是这样 - 我至少没有一个可靠的答案;我只能推测。我认为这不是 webdriver 协议的一部分,因此没有标准化的方法可以从每个受支持的浏览器中获取它;以及如果用户使用一些晦涩的设置调用set_preference() 该怎么办 - 当没有协议时,它应该怎么做。至少这是我的想法。
    • 我不喜欢 - 我努力在答案中提供我可以证明的信息,或者至少有充分的理由相信是正确的/“如果是我,我会这样做正在做”。这里不是这种情况——这是我很满意的解释,但它和下一个解释一样好 :) >“另外,我在哪里可以找到更多关于这个的信息”——在 webdriver 协议规范中——w3.org/TR/webdriver1——它是有趣的(虽然有点刺耳)阅读;尤其是当您意识到并非所有浏览器驱动程序都已完全实现它时,尽管它的最新版本已有 8 个月的历史。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2017-10-14
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多