需求:
今天有位朋友遇到一个梗,selenium使用firefox打开多个网页时,firefox总是以新窗口的方式打开;而这位朋友的需求是以标签页的方式打开新页面。
1.新窗口方式:
2.新标签页方式(在IE称为新选项卡):
当然从selenium观点来出发,无论浏览器以新窗口或者新标签,都不影响WebDriver操作元素,只需要做好句柄的切换即可。而现在的需求就是不想以新窗口方式打开,因为打开多个窗口觉得烦、乱;哈哈,我是处女座的,不知道这位朋友是不是。
解决思路
1.第一点:“修改浏览器的设置”
如下图设置以标签页方式打开设置好
使用selenium运行代码,发现依然是以窗口的方式打开,查看selenium启动的firefox浏览器设置,发现”需要新建窗口时以新建标签页代替(T)“这个选项是取消的,这就可以推断,WebDriver启动firefox时会重置浏览器的配置。
2.第二点:代码设置
冒出的思路是在selenium启动firefox时,设置一下浏览器的打开新窗口的方式,通过查询资料知道browser.link.open_newwindow的值是设置浏览器新开窗口的方式
- 值为1,在当前窗口打开
- 值为2,新窗口方式打开
- 值为3,以标签页方式打开
启动时设置的代码如下:(注意每个default文件在不同机器上路径不同)
String firefoxProfileDir="C:\\Users\\Administrator\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\vxhj8pmc.default";
FirefoxProfile profile = new FirefoxProfile(new File(firefoxProfileDir));
profile.setPreference("browser.link.open_newwindow", 3);
WebDriver driver = new FirefoxDriver(profile);
运行后报错Caused by: java.lang.IllegalArgumentException: Preference browser.link.open_newwindow may not be overridden: frozen value=2, requested value=3,不允许修改配置。
3.第三点:修改webdriver_prefs.json文件
继续查资料发现selenium的jar中对firefox进行了格外的照顾,有一个特定的json文件规定了firefox浏览器的配置,这个webdriver_prefs.json文件路径在org/openqa/selenium/firefox下面;
打开文件找到browser.link.open_newwindow的值为2,表示firefox浏览器以新窗口的方式打开。所以无论我们做任何操作都是徒劳无功的。找到原因后,就好办了,只要想办法把这个文件的browser.link.open_newwindow值改成3,就会以标签页方式打开。
幸运的是这个文件是Json文件,而不是class编译文件里写死的,所以我们可以尽情的修改它。把jar后缀改成zip后缀,找到文件打开修改为3后保存,再改回jar的后缀即可(记得备份,后面有彩蛋)。然后替换Eclipse中的旧jar包,运行代码,神奇的发现,firefox以标签页的方式打开窗口,完美的解决了需求。
彩蛋来了
以标签页的方式打开新窗口,兴高采烈之际,切换句柄来了一个大坑,使用firefox的标签页方式打开,无论打开了多少个,使用driver.getWindowHandles()方法得到的Set句柄集合都只有一个值,而用IE、Chrome并没有这个问题。为了验证是不是2变成3引起的,把备份的还原回去运行,发现真是这样,以新窗口的方式打开可以正确得到全部句柄。就因为一点处女座情节知道了这么大的问题,好像也挺知足的。在度娘上找答案是不可能的,翻墙出去找到了原因,大概的解释就是说,驱动程序无法管理以标签页的方式打开的窗口。具体请看https://github/SeleniumHQ/selenium/issues/1614。
总结:这也就说得过去,为什么selenium要默认设置2了,对于Selenium来说新窗口是最标准的firefox打开方式。
百度阅读:https://yuedu.baidu/ebook/82a757ec7e192279168884868762caaedd33baa3
需求:
今天有位朋友遇到一个梗,selenium使用firefox打开多个网页时,firefox总是以新窗口的方式打开;而这位朋友的需求是以标签页的方式打开新页面。
1.新窗口方式:
2.新标签页方式(在IE称为新选项卡):
当然从selenium观点来出发,无论浏览器以新窗口或者新标签,都不影响WebDriver操作元素,只需要做好句柄的切换即可。而现在的需求就是不想以新窗口方式打开,因为打开多个窗口觉得烦、乱;哈哈,我是处女座的,不知道这位朋友是不是。
解决思路
1.第一点:“修改浏览器的设置”
如下图设置以标签页方式打开设置好
使用selenium运行代码,发现依然是以窗口的方式打开,查看selenium启动的firefox浏览器设置,发现”需要新建窗口时以新建标签页代替(T)“这个选项是取消的,这就可以推断,WebDriver启动firefox时会重置浏览器的配置。
2.第二点:代码设置
冒出的思路是在selenium启动firefox时,设置一下浏览器的打开新窗口的方式,通过查询资料知道browser.link.open_newwindow的值是设置浏览器新开窗口的方式
- 值为1,在当前窗口打开
- 值为2,新窗口方式打开
- 值为3,以标签页方式打开
启动时设置的代码如下:(注意每个default文件在不同机器上路径不同)
String firefoxProfileDir="C:\\Users\\Administrator\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\vxhj8pmc.default";
FirefoxProfile profile = new FirefoxProfile(new File(firefoxProfileDir));
profile.setPreference("browser.link.open_newwindow", 3);
WebDriver driver = new FirefoxDriver(profile);
运行后报错Caused by: java.lang.IllegalArgumentException: Preference browser.link.open_newwindow may not be overridden: frozen value=2, requested value=3,不允许修改配置。
3.第三点:修改webdriver_prefs.json文件
继续查资料发现selenium的jar中对firefox进行了格外的照顾,有一个特定的json文件规定了firefox浏览器的配置,这个webdriver_prefs.json文件路径在org/openqa/selenium/firefox下面;
打开文件找到browser.link.open_newwindow的值为2,表示firefox浏览器以新窗口的方式打开。所以无论我们做任何操作都是徒劳无功的。找到原因后,就好办了,只要想办法把这个文件的browser.link.open_newwindow值改成3,就会以标签页方式打开。
幸运的是这个文件是Json文件,而不是class编译文件里写死的,所以我们可以尽情的修改它。把jar后缀改成zip后缀,找到文件打开修改为3后保存,再改回jar的后缀即可(记得备份,后面有彩蛋)。然后替换Eclipse中的旧jar包,运行代码,神奇的发现,firefox以标签页的方式打开窗口,完美的解决了需求。
彩蛋来了
以标签页的方式打开新窗口,兴高采烈之际,切换句柄来了一个大坑,使用firefox的标签页方式打开,无论打开了多少个,使用driver.getWindowHandles()方法得到的Set句柄集合都只有一个值,而用IE、Chrome并没有这个问题。为了验证是不是2变成3引起的,把备份的还原回去运行,发现真是这样,以新窗口的方式打开可以正确得到全部句柄。就因为一点处女座情节知道了这么大的问题,好像也挺知足的。在度娘上找答案是不可能的,翻墙出去找到了原因,大概的解释就是说,驱动程序无法管理以标签页的方式打开的窗口。具体请看https://github/SeleniumHQ/selenium/issues/1614。
总结:这也就说得过去,为什么selenium要默认设置2了,对于Selenium来说新窗口是最标准的firefox打开方式。
百度阅读:https://yuedu.baidu/ebook/82a757ec7e192279168884868762caaedd33baa3