本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记
WEB UI自动化环境配置
(推荐靠谱的博客文章来进行环境配置,具体的我就不写了)
下载和安装 Python+下载和安装 PyCharm+安装 Selenium 库+下载浏览器驱动程序:
具体操作还得是看这两篇文章:
Selenium web UI自动化测试简介与环境搭建_selenium webui-CSDN博客
PyCharm 搭建 Selenium + Python 的自动化测试环境_pycharm自动化测试-CSDN博客
然后安装selenium的时候出现了安装不成功的问题,那就参考这篇文章:
安装selenium(超级详细)_selenium安装-CSDN博客
Chorme Driver安装链接在这,非常全了:
Chrome for Testing availability (googlechromelabs.github.io)
Anaconda安装教程参考这篇很实用:
Anaconda安装教程傻瓜教程_anaconda下没有usr目录-CSDN博客
遇到的问题及解决方法:
下载的谷歌浏览器驱动版本和selenium版本一致,但新版本selenium浏览器总是会退,解决方法:
在最后加个input()等待
选择元素的基本方法
find_element 和 find_elements 的区别
使用 find_elements
选择的是符合条件的 所有
元素, 如果没有符合条件的元素, 返回空列表
使用 find_element
选择的是符合条件的 第一个
元素, 如果没有符合条件的元素, 抛出 NoSuchElementException 异常
通过WebElement对象选择元素
WebDriver 对象 选择元素的范围是 整个 web页面
WebElement 对象 选择元素的范围是 该元素的内部
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 对象
wd = webdriver.Chrome()
"""
后续所有的 find_element 或者 find_elements 之类的方法调用 都会采用上面的策略:
如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长
"""
# 隐式等待 以后创建 WebDriver 对象之后,都要条件反射的加上这个隐式等待
wd.implicitly_wait(10)
try:
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
# 根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element(By.ID, 'kw')
# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
element.send_keys('通讯\n')
time.sleep(1)
#这里要先把之前的通讯清掉,不然就是“通讯科技了”,这样搜不到的
element.clear()
element = wd.find_element(By.ID,'kw')
element.send_keys('科技\n')
# 等待用户输入,以便观察当前页面状态
input("按下任意键继续...")
element = wd.find_element(By.ID,'go')
element.click()
#让这个代码执行不要那么块 网站响应的速度相对较慢
# import time
#问题是这里设置多长时间合适呢
"""
解决方法:当发现元素没有找到的时候,并不立即返回 找不到的 元素的错误
而是周期(每隔半秒)重新寻找元素 直到元素找到
或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)。
"""
# while True:
# try:
# # 网站还没有来得及 返回搜索结果,我们就执行了如下代码
# element = wd.find_element(By.ID, '1')
# print(element.text)
# break
# except:
# time.sleep(1)
"""
但这样会出现死循环,这里要用implicitly_wait ,隐式等待 ,或者 全局等待 。
该方法接受一个参数,用来指定 最大等待 时长
"""
element = wd.find_element(By.ID, '1')
print(element.text)
# 要获取整个元素对应的HTML文本内容,可以使用
print(element.get_attribute('outerHTML'))
# 如果,只是想获取某个元素内部的HTML文本内容,可以使用
finally:
# 关闭浏览器
wd.quit()
操控元素的基本方法
操控元素通常包括
-
点击元素
-
在元素中输入字符串,通常是对输入框这样的元素
-
获取元素包含的信息,比如文本内容,元素的属性
点击元素:就是调用元素WebElement对象的 click方法
输入字符串
:就是调用元素WebElement对象的send_keys方法
获取元素:
1 通过WebElement对象的 text
属性,可以获取元素 展示在界面上的
文本内容
2 通过WebElement对象的 get_attribute
方法来获取元素的属性值
3 要获取整个元素对应的HTML文本内容,可以使用 element.get_attribute('outerHTML')
4 如果,只是想获取某个元素 内部
的HTML文本内容,可以使用 element.get_attribute('innerHTML')
5 对于input输入框的元素,要获取里面的输入文本,用text属性是不行的,这时可以使用 element.get_attribute('value')
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 实例对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome()
try:
# WebDriver 实例对象的get方法可以让浏览器打开指定网址
wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
# 等待页面加载完成
#这里很重要 不然总是闪退
input("等待页面加载,按任意键继续...")
# 根据 class name 选择元素,返回的是一个列表
# 里面都是class属性值为animal的元素对应的WebElement对象
element = wd.find_element(By.ID, 'container')
# 限制 选择元素的范围是 id 为 container 元素的内部。
spans = element.find_elements(By.TAG_NAME, 'span')
for span in spans:
print(span.text)
finally:
# 关闭浏览器
wd.quit()
定位元素
eg:拿测试百度网页来看:
通过ID定位
在网页上通过 ID 定位一个元素(通常是一个输入框),然后向这个输入框中输入 "Selenium",最后打印出这个输入框的当前值。
# 1. By ID - 定位搜索输入框
search_box_by_id = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "kw"))
)
search_box_by_id.send_keys("Selenium") # 在输入框中输入"Selenium"
print("Located by ID:", search_box_by_id.get_attribute("value"))
-
WebDriverWait(driver, 10)
:- 这个部分表示对
driver
(Selenium 的浏览器控制对象)进行最多 10秒 的等待时间。Selenium 中有隐式和显式等待,此处使用的是显式等待,即在指定时间内等待某个条件满足。
- 这个部分表示对
-
until(EC.presence_of_element_located((By.ID, "kw")))
:until
方法的作用是在指定的条件被满足前一直等待,或者直到超时。这里的条件是EC.presence_of_element_located
,它会等待页面上某个元素(通过指定的定位方法,如ID)被找到并存在。(By.ID, "kw")
表示通过 ID 属性定位页面上的元素,ID 的值是"kw"
。这个ID通常用于唯一标识页面中的某个元素。
-
search_box_by_id.send_keys("Selenium")
:send_keys
方法用于在找到的输入框中模拟键盘输入。这里它向页面上的搜索框输入了 "Selenium" 这个字符串。
-
print("Located by ID:", search_box_by_id.get_attribute("value"))
:get_attribute("value")
是获取输入框当前的值。它会打印出输入框中已经填入的内容,以确认"Selenium"
已经正确输入。
按名称定位
通过 Name 或 ID 属性定位页面上的搜索按钮(最终是通过 ID "su"
定位),并模拟点击操作。
# 2. By Name - 定位搜索按钮
# 定位搜索按钮(名称为wd),并点击按钮(百度按钮的ID实际为su,所以切换成用ID定位)。
search_button_by_name = driver.find_element(By.NAME, "wd")
search_button_by_name = driver.find_element(By.ID, "su") # 百度搜索按钮的ID为 "su"
search_button_by_name.click()
print("Located by Name: 搜索按钮点击成功")
-
search_button_by_name = driver.find_element(By.NAME, "wd")
:- 尝试通过按钮的 Name 属性来定位搜索按钮。
find
- 尝试通过按钮的 Name 属性来定位搜索按钮。