如何使用 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 浏览器的主要内容,如果未能解决你的问题,请参考以下文章
如果'checked'属性不可用于使用isChecked / isSelected,如何使用selenium检查复选框的状态? [复制]