目录
(1)试了ID,Xpath,Name等多种方法无法定位网页元素?
一、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
现在Selenium支持自动搜索driver路径,所以你不放也可以的,环境变量貌似也不用配置
(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")
报错的话,不是代码错了就是版本不匹配,自己找一找。
二、实例
1.启动部分
浏览器加载需要时间,事件监听器什么的太难了,所以我更喜欢让我的代码自己停一下,简单可行。
from selenium import webdriver
import time
options = webdriver.EdgeOptions()
options.use_chromium = True # 使用google内核
options.add_experimental_option('excludeSwitches', ["enable-logging"])
options.add_argument('--inprivate') # 无痕模式
options.add_argument('--headless') # 无界面模式
options.add_argument('--mute-audio')
driver = webdriver.Edge(options=options) # 启动浏览器
time.sleep(0.5)
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) # 填写文本框
3.模拟鼠标移动
我操作的网页貌似增加了一个检测鼠标移动的功能,所以就有了这一项。
from selenium.webdriver import ActionChains
click = driver.find_element(By.XPATH, '/html/body/div[2]/div[4]')
click_x = click.location.get('x')
click_y = click.location.get('y')
ActionChains(driver).move_by_offset(click_x + 5, click_y + 5).click().perform()
ActionChains(driver).move_by_offset(-(click_x + 5), -(click_y + 5)).perform()
三、参考文献
这里只放对我帮助比较大的一些:
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)