如何使用 Javascript 通过 selenium 3.6.0 使用另一个配置文件打开 Firefox 浏览器

Posted

技术标签:

【中文标题】如何使用 Javascript 通过 selenium 3.6.0 使用另一个配置文件打开 Firefox 浏览器【英文标题】:how to open a firefox browser through selenium 3.6.0 with another profile using Javascript 【发布时间】:2018-11-05 16:01:28 【问题描述】:

我想通过 selenium-webdriver 3.6.0 启动 Firefox 浏览器,更改了浏览器的一些默认设置。具体来说,我希望 Firefox 在自动测试期间下载文件,而不提示是否保存并下载到默认目录以外的预定义目录,即下载文件夹。

在谷歌浏览器上的做法是这样的:

if (this.bName === 'chrome')   
   var cap = Capabilities.chrome();  
   var options =   
      'prefs':   
          profile:   
            default_content_settings:   
                  popups: 0,  
            ,  
          ,  
          download:   
            default_directory: path.join(__dirname,  
 '/../Downloads For Testing'),  
            
        
 ;  
 var cap = cap.set('chromeOptions', options);  
 this.browser = new Builder().withCapabilities(cap).build();  

通过在创建新配置文件后设置首选项在 Firefox 上进行的相关尝试无效。

我包含来自 Firefox 文件夹的配置文件

firefoxProfile = require('selenium-webdriver/firefox').Profile;

我使用新功能构建

else if (this.bName === 'firefox') 
            var cap = Capabilities.firefox();
            var profile = new firefoxProfile;
            profile.setPreference("browser.download.folderList", 2);
            profile.setPreference("browser.download.manager.showWhenStarting", false);
            profile.setPreference("browser.download.dir", path.join(__dirname, '/../Downloads For Testing'));
            profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/html");
            cap.set('firefox_profile', profile);
            console.log(profile);
            this.browser = new Builder().withCapabilities(cap).build();
        

这是新配置文件对象的打印输出:

Profile 
  preferences_:
    'browser.download.folderList': 2,
     'browser.download.manager.showWhenStarting': false,
     'browser.download.dir': 'C:\\path\\Downloads For Testing',
     'browser.helperApps.neverAsk.saveToDisk': 'text/html' ,
  template_: undefined,
  extensions_: []

浏览器启动时没有错误,所有的promise都被测试框架mocha正确返回,直到按下按钮下载文件并显示正常对话框,所以没有成功。

【问题讨论】:

嗨。至少有人可以对这个问题做出反应吗?是不是有些不清楚,或者看过它的 8 个人不知道答案。我应该发布到堆栈溢出的另一部分吗? 【参考方案1】:

selenium-webdriver\firefox 中的 index.js 文件清楚地说明了如何动态创建新配置文件并设置首选项。

* The @linkplain Profile class may be used to configure the browser profile
* used with WebDriver, with functions to install additional
* @linkplain Profile#addExtension extensions, configure browser
* @linkplain Profile#setPreference preferences, and more. For example, you
* may wish to include Firebug:
*
*     const Builder = require('selenium-webdriver');
*     const firefox = require('selenium-webdriver/firefox');
*
*     let profile = new firefox.Profile();
*     profile.addExtension('/path/to/firebug.xpi');
*     profile.setPreference('extensions.firebug.showChromeErrors', true);
*
*     let options = new firefox.Options().setProfile(profile); 
*     let driver = new Builder()
*         .forBrowser('firefox')
*         .setFirefoxOptions(options)
*         .build();

试过了,还是不行。显然我没有尝试添加扩展,而只是设置了我的问题中写的 4 个首选项。

不过,作为一种解决方法,对我来说,诀窍是通过在 Windows 的“运行”对话框中执行 firefox.exe -p 创建一个新配置文件。 (按 Windows 图标键和键盘上的 R 以获取运行对话框) 之后,我使用这个新的“测试”配置文件作为模板,通过 selenium 动态创建一个新的临时配置文件。

var profile = new firefox.Profile('/pathTo/firefox profile for testing/');

这就是诀窍。这似乎与 Firefox 和 mime 类型有关。如果发送文件进行下载的服务器将文件的内容类型命名为与 Firefox 不同的名称,则不会发生自动保存,并且会出现“保存或打开文件”对话框。 可能出于安全原因。 The content type can be found here

在我的情况下,它是关于一个 csv 文件并设置 profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv") 而服务器发送的内容类型为 text/html 并且 firefox 将其识别为 TXT 文件不起作用。 所以我通过将'mimeTypes'中'text/plain'的属性'ask'从true设置为false来编辑/pathTo/firefox profile for testing/中的handlers.json文件。

当然,我将文件下载到的路径设置为唯一的首选项。顺便说一句,这也将创建路径,至少是最后一个文件夹。所以我的代码是:

    else if (this.bName === 'firefox') 
        var cap = Capabilities.firefox();
        var profile = new firefox.Profile('/pathTo/firefox profile for testing/');
        profile.setPreference("browser.download.dir", '/pathTo/Downloads For Testing');
        let options = new firefox.Options().setProfile(profile);
        this.browser = new Builder().forBrowser(this.bName).setFirefoxOptions(options).build();
    

You can also try this and not mess with the handler.json (end of page) 但对我不起作用。

Or just go brute force,这也没有。

【讨论】:

以上是关于如何使用 Javascript 通过 selenium 3.6.0 使用另一个配置文件打开 Firefox 浏览器的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Remote-Control架构

如何通过javascript 使用 MQTT

如何使用Javascript通过'POST'方法重定向?

Python 3前言

如果'checked'属性不可用于使用isChecked / isSelected,如何使用selenium检查复选框的状态? [复制]

如何通过javascript执行php