目录
(1)试了ID,Xpath,Name等多种方法无法定位网页元素?
气死我了,前两周还在用的Selenium tools这周就没了……,这篇文章一下就成了时代的眼泪
一、Selenium库配置
1.Selenium库的安装
贴个官网:Selenium
安装并不费事儿,win版直接pip install selenium就可以,但是喜欢用conda虚拟环境的我因为长时间没有安装过新东西,忘记了在不激活虚拟环境和不使用anaconda的情况下直接pip会安装在conda base环境中,而不是我创建的虚拟环境。
在win11(win10未尝试)中直接在给虚拟环境pip完全可以,而且很方便,我很喜欢,但有一个注意事项:
打开命令提示符(power shell或者其他的什么叫法)→cd 到虚拟环境pip所在目录→“./pip install selenium”而不是“pip install selenium”
2.浏览器配置
配置过程需要浏览器官方的驱动软件,我从Chrome起步,最后配成了Edge。这地方费了我老大功夫了,虽然官网有说明文档,但我觉得那个文档跟假的一样,从配不好到配好了用不了,简直了,我都怀疑我是不是安装了假的selenium。
不同浏览器的配置流程是一样的为:找到自己的浏览器版本,然后在对应的Driver官网上找到对应版本的Driver,下载安装。
(1)查看版本:
(2)下载:
ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)
Microsoft Edge WebDriver | Microsoft Edge Developer
对,上面这个才是,而不是各种各样的镜像或者存储站,这事儿成了我痛苦的根源,因为我的Chrome更新一直开着,所以通过百度和看CSDN得到的很多配置文章中给的下载链接让我一直找不到对应版本的Chrome Driver,我甚至看了相关的Chrome回退的文章,比如以下的旧版本放置站:
Download older versions of Google Chrome for Windows, Linux and Mac (slimjet.com)
(3)配置:
将下载得到的Chromedriver.exe分别复制一份放置到
浏览器启动程序所在目录下 和 python环境的Scripts目录下,
并添加路径环境变量,两个浏览器配置过程是相同的,比如我配置的Edge
(4)简单测试
driver = webdriver.Chrome()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
或者
driver = webdriver.Edge()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
Chrome不会报错,你可以自己写了,但是Edge会报错,报错了不要紧,失败是成功他妈呀,慢慢来。说起来要是早点知道Chrome Driver的官网,我也不会去找Edge……
3.Edge试运行报错
Selenium上给出使用的简单代码,Chrome是可以的,Edge不行,直接用会报错,
比如:WebDriverException: Message: 'MicrosoftWebDriver.exe' executable needs to be in PATH.
再比如:AttributeError: module 'selenium.webdriver' has no attribute 'EdgeOptions'
还比如:WebDriverException: Message: Service MicrosoftWebDriver.exe unexpectedly exited. Status code was: 1
虽然我很急,但是也没什么用,最终还是慢慢解决了他们。
(1)找不到MicrosoftWebDriver.exe
这个名字显然和我们安装的文件名不太一样,所以,要么你把你的“msedgedriver.exe”重命名为“MicrosoftWebDriver.exe”
要么就在代码中指定名称:driver = webdriver.Edge(executable_path='msedgedriver.exe')
如果还报错,可能是路径问题,这时你可以暴力一点,直接上完整路径:
driver = webdriver.Edge(executable_path= r'C:\Users\Desktop\Test\penv\Scripts\msedgedriver.exe')
(2)EdgeOptions
我相信,用代码来操作浏览器的人,干的事儿不会很简单,所以应该也绕不过浏览器启动设置,对于Edge来说,需要额外加装msedge库,然后使用其中的msedge.selenium_tools工具来协助完成相关操作。以下是额外的代码:
from msedge.selenium_tools import Edge, EdgeOptions
options = EdgeOptions()
options.use_chromium = True
options.add_argument('--inprivate') # 无痕模式
options.add_argument('headless') # 无界面模式
driver = Edge(executable_path=r'C:\Users\Desktop\Test\penv\Scripts\msedgedriver.exe',
options=options)
二、实例
1.启动部分
浏览器加载需要时间,事件监听器什么的太难了,所以我更喜欢让我的代码自己停一下,简单可行。
from selenium import webdriver
from msedge.selenium_tools import Edge, EdgeOptions
import time
options = EdgeOptions()
options.use_chromium = True
options.add_argument('--inprivate') # 无痕模式
driver = Edge(executable_path=r'C:\Users\ Desktop\Test\penv\Scripts\msedgedriver.exe',
options=options)
url = ''
driver.get(url)
2.操作部分
(1)试了ID,Xpath,Name等多种方法无法定位网页元素?
把这句代码加上试一试:
driver.switch_to.frame(driver.find_element_by_id('iframe'))
根据大佬们的说法,原本的定位器在整个框架Frame中,所以无法定位iframe中的东西,这句代码可以将把定位器切换到网页加载出来的灵活的iframe上,当然用完还要切换回去,大佬说的很清楚:selenium自动化driver.switch_to.frame用法-CSDN博客
(2)寻找标签、名字
打开开发者工具,选中代码就能看到对应的框框,选中框框就能看到对应的代码。
Id、name什么的可以直接看到,Xpath在右键菜单中
(3)代码
这一部分其实就很简单,能找到,就能控制。
这里是多个窗口的打开和创建的代码,使用了script:
newTab = "window.open('" + url + "')"
driver.execute_script(newTab)
driver.switch_to.window(driver.window_handles[-1])
通过Id或者xpath找到需要操作的框框,然后操作,
city = driver.find_element_by_id('city')
PR = driver.find_element_by_xpath('/html/body/div[2]/div[9]/select[1]') # 寻找组件
PR = webdriver.support.ui.Select(PR) # 下拉菜单转换为可操作对象
PR.select_by_value('28') # 选择
city.send_keys(myname) # 填写文本框
三、参考文献
这里只放对我帮助比较大的一些:
selenium自动化driver.switch_to.frame用法-CSDN博客
Python+Selenium+Edge浏览器安装与简单运行(1/2)_python edgedriver-CSDN博客
Python + Selenium + Microsoft Edge浏览器运行环境搭建及配置无界面模式 - lixuelong - 博客园 (cnblogs.com)
ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)