0


Selenium自动化 Web 浏览器操作

文章目录

Selenium自动化 Web 浏览器操作

Selenium简介

Selenium可以模拟浏览器运行,用于web应用程序测试工具。可以直接运行浏览器,像用户自己操作一样。

安装Selenium

pip install selenium

安装WebDriver

WebDriver安装版本要和所安装的浏览器版本一致,这里使用谷歌浏览器

先查看谷歌浏览器版本

chrome://version/

选择版本一致的驱动

https://chromedriver.storage.googleapis.com/index.html(114版本之前)

https://googlechromelabs.github.io/chrome-for-testing/#canary(128版本之后)

若找不到一致的就选择相近的版本

使用问题

驱动加载报错

AttributeError: ‘str’ object has no attribute ‘capabilities’

原因是selenium 版本太高,初始化驱动方式有问题

# 不能使用这种方式
driver = webdriver.Chrome("./chromedriver")
# 应该使用这种方式
driver = webdriver.Chrome()

得出结论,使用一个库时,不能仅网上搜出代码就直接使用,要找到库官方网站对应的版本使用文档,按照文档来使用,就会少出很多问题。

版本不匹配

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114,Current browser version is 128.0.6613.119

下载相应版本,并放到程序同一个目录即可。

常用API

常用API仅做参考,当使用一个库时,要去官方文档看自己使用版本对应的文档,因为随着版本更新,函数API都是会变化的,只要掌握基本思路即可。该Selenium版本是4.24

创建实例

# 加detach 配置 ,让程序执行完,浏览器不关闭,除非程序中指定的关闭
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
# 初始化 WebDriver(记得替换路径)
driver = webdriver.Chrome(options=options)

该版本的初始化驱动,会默认从安装驱动的链接去下载,若遇到网络不好,则会一直卡住,需要等待好长时间。下面可以配置自己下载的驱动

driver = webdriver.Chrome(service=Service(executable_path=r'.\chromedriver.exe'),options=options)

定位元素

# 打开浏览器(指定具体页面ip路径)
driver.get("https://www.baidu.com")
# 查找第一个匹配的元素
login_element = driver.find_element(By.CLASS_NAME, 'login')
# 查找匹配到的所有元素
login_element = driver.find_elements(By.CLASS_NAME, 'login')

driver.find_element(By, value),其中By 参数可以是如下:

在这里插入图片描述

其中,XPATH是网页元素从根节点到该节点的路径定位,可以唯一定位一个元素(网页元素各个节点构成一个树形结构)

ID 就是元素定义的ID,前端开发时写的

Class_name 元素定义的class

TAG_name 元素名称

其他的就不写了,使用时自己尝试

由于现在web应用基本都是基于vue或react单页面应用了,前端开发时不会定义那么详细ID和class,那么这种场景下,直接使用XPATH是最高效的方法。

鼠标事件

# 模拟鼠标点击
login_element.click()

表单相关

# 模拟输入框输入(send_keys())
driver.find_element(By.XPATH,
                        "//*[@id='app']/div/div[1]/div[2]/div[2]/div/div[2]/form/div[1]/div/div/input").send_keys(
        account)

多窗口切换

在web应用中,点击页面时,往往会打开多个浏览器标签页,也就是多个窗口。

Selenium会为每个窗口创建一个句柄,并存储下来,用来切换窗口。当窗口关闭时,句柄值就会清除。

# 获取当前窗口句柄
driver.getWindowHandle()
# 获取所有打开的窗口句柄
driver.getWindowHandles()
# 切换到新的窗口
curWindow = driver.getWindowHandle()
allWindow = driver.getWindowHandles()
     for w in allWindow:
       if w!=curWindow:
       driver.switchTo().window(w)
 

对于单页面应用,切换页面不算切换窗口,因为始终是在一个标签页里切换。

等待

由于web网页用了很多新技术,页面加载也有快有慢,若某个元素还未加载出来,便定位获取,就会抛出异常。等待机制就是等元素加载完后再获取元素定位。分为显示等待和隐式等待,意思就是程序暂停多长时间再继续执行。

显示等待
# 等待10s后,判断until后的条件是否满足,是则返回该元素,否则抛出异常
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'')))

until后的条件有很多,可以自己去探索

隐式等待
# 直接指定等待时间 单位是S 
driver.implicitly_wait(10)

这个用于指定所有元素被定位到的等待时间,意思就是 所有元素定位前都要等待这个时间之后再去定位元素

也可以使用time.sleep(3),但效率会比较低。

若要等待新页面加载完后,再执行,可以使用如下:

WebDriverWait(driver,3).until(EC.url_changes(driver.current_url))

文件上传下载

下载比较简单,就是定位到页面的下载链接,直接点击即可

上传

driver.find_element(By.XPATH, '//*[@id="pane-1"]/div[1]/div/input').send_keys(r'C:\Users\xxx\Desktop\1.jpg')

上传思路就是找到对应的文件表单,把要上传的图片直接写进去。该方法没有打开文件资源管理器选择文件步骤

经验总结

1 显示等待和隐式等待不能一起使用,会报超时错误;

2 显示等待有时不太好用,直接使用time.sleep()会稳定很多,但效率会低,看怎么取舍;


本文转载自: https://blog.csdn.net/hubuwch/article/details/142171144
版权归原作者 花菜回锅肉 所有, 如有侵权,请联系我们删除。

“Selenium自动化 Web 浏览器操作”的评论:

还没有评论