Selenium firefox浏览器修改为标签页打开方式的各种坑

需求:

    今天有位朋友遇到一个梗,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.com/SeleniumHQ/selenium/issues/1614

总结:这也就说得过去,为什么selenium要默认设置2了,对于Selenium来说新窗口是最标准的firefox打开方式。

百度阅读:https://yuedu.baidu.com/ebook/82a757ec7e192279168884868762caaedd33baa3

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Selenium 的 Python 版本来实现。 首先,需要在本地安装 Selenium 库。安装完成后,可以通过以下代码来导入 Selenium 库并打开浏览器: ``` from selenium import webdriver driver = webdriver.Firefox() # 打开火狐浏览器 driver.get("https://www.example.com") # 打开网 ``` 接下来,可以使用 Selenium 的 `find_elements_by_tag_name` 方法来查找所有的超链接(`<a>` 标签): ``` links = driver.find_elements_by_tag_name("a") ``` 然后,可以遍历所有的超链接,并使用 Selenium 的 `get` 方法打开链接指向的网: ``` for link in links: url = link.get_attribute("href") # 获取超链接的 URL driver.get(url) # 打开超链接指向的网 ``` 最后,可以使用 Selenium 的 `page_source` 属性来获取当前面的 HTML 源代码,并将其保存到文件中: ``` html = driver.page_source # 获取当前面的 HTML 源代码 with open("page.html", "w") as f: f.write(html) # 将 HTML 源代码写入文件 ``` 完整的代码如下: ``` from selenium import webdriver driver = webdriver.Firefox() # 打开火狐浏览器 driver.get("https://www.example.com") # 打开网 links = driver.find_elements_by_tag_name("a") # 查找所有的超链接 for link in links: url = link.get_attribute("href") # 获取超链接的 URL ### 回答2: 使用Selenium库可以很方便地打开网并模拟点击操作。下面是使用Python语言对该需求进行实现的代码示例: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 创建Chrome浏览器实例 driver = webdriver.Chrome() # 打开网 driver.get("http://example.com") # 等待面加载完成 time.sleep(2) # 获取所有可点击链接的元素 links = driver.find_elements_by_css_selector('a[href]') # 逐个点击链接并保存打开的网为html文件 for link in links: # 点击链接 link.click() # 等待新面加载完成 time.sleep(2) # 获取当前面的html源码 html = driver.page_source # 保存网为html文件 with open(f"{link.text}.html", "w", encoding="utf-8") as f: f.write(html) # 返回上一面 driver.back() # 关闭浏览器实例 driver.quit() ``` 以上代码首先使用Selenium创建了一个Chrome浏览器实例,然后打开指定网,并等待面加载完成。接着通过`find_elements_by_css_selector`方法获取到所有可点击链接的元素,使用循环对每个链接进行点击操作。在点击链接后,等待新面加载完成并利用`driver.page_source`方法获取当前面的html源码,然后将其保存为以链接文本命名的html文件。最后通过`driver.back()`方法返回上一面,继续点击下一个链接。循环结束后,关闭浏览器实例。 请注意,代码中的等待时间可能需要根据实际网加载速度进行调整。另外,还可以使用其他方式来获取链接元素,比如通过xpath、class等等。 ### 回答3: 使用Selenium可以打开网中的所有可点击链接,并保存为HTML文件。以下是实现的步骤: 1. 导入必要的库: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options import time ``` 2. 设置Chrome浏览器的参数和选项,其中指定下载目录和禁止弹窗: ```python options = Options() options.add_argument("--headless") # 无界面模式 prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': '<保存目录>'} options.add_experimental_option('prefs', prefs) ``` 请将`<保存目录>`替换为你想要保存HTML文件的目录路径。 3. 初始化浏览器驱动器并打开网: ```python driver = webdriver.Chrome(options=options) driver.get("<目标网链接>") ``` 请将`<目标网链接>`换成你想要打开的网链接。 4. 找到面中所有可点击的链接元素,并保存其href属性: ```python links = driver.find_elements_by_css_selector("a") urls = [] for link in links: url = link.get_attribute("href") if url: urls.append(url) ``` 5. 逐个打开链接并保存为HTML文件: ```python for url in urls: driver.get(url) time.sleep(2) # 加入适当的延时,确保网加载完全 html = driver.page_source filename = url.split("/")[-1] + ".html" # 提取链接中的文件名作为保存的HTML文件名 with open(filename, "w", encoding="utf-8") as file: file.write(html) ``` 6. 关闭浏览器和驱动器: ```python driver.quit() ``` 以上是使用Selenium打开网中所有可点击链接并将打开的网保存为HTML文件的方法。请根据自己的需要进行相关调整及异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值