Python+Selenium4 Web自动化测试框架学习(一)

主要框架及技术

1.第一个selenium例子

python 复制代码
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.bilibili.com")
driver.find_element(By.CLASS_NAME,"nav-search-input").send_keys("你好,selenium")
driver.find_element(By.CLASS_NAME,"nav-search-btn").click()
time.sleep(3)

2.selenium4底层刨析


3.元素定位方式

1.根据id定位

id一般是唯一的。可在浏览器F12开发者工具中console用document.getElementById()来验证是否有这个元素


2.根据CLASS_NAME定位

在根据CLASS_NAME定位时,有些class的名称中间有空格,不能直接根据名称定位,这样是错误用法,但是,将空格改为 . 就能找到

在抖音的搜索框中,其id名称明明为中间一个空格,实际却需要换成 . 才能成功找到。


3.根据tag_name定位

tag_name一般唯一,不常用,如果有多条该标签,默认为第一条。


4.根据name定位

一般表单有这个属性,用法与上面类似。实际用得也不多


主要用来定位a标签。(可点击的标签)

PARTIAL_LINK_TEXT为模糊匹配,用法与另一个类似。前后模糊匹配。


6.通过CSS_SELECTOR来定位(重点)


通过CSS_SELECTOR来定位(下)(重点)

可通过F12开发者工具复制selector。相对路径的方式。


7.通过XPATH定位

有相对路径和绝对路径两种定位方式。/ 为绝对路径 // 为相对路径

同级弟弟元素:

driver.find_element(By.XPATH,'//span[@class="demonstration" and text()="默认 click 触发子菜单"]/following-sibling::div/div/input').click()

同级哥哥元素:

driver.find_element(By.XPATH,'//span[@class="demonstration" and text()="默认 click 触发子菜单"]/preceding-sibling::div/div/input').click()

用法类似同级弟弟元素


4.不同元素定位方式

Radio单选框


checkbox复选框


Select选择器(下拉框)

普通select标签的下拉框:

异常下拉框(非select标签)通过模拟人类使用方式:

python 复制代码
#select下拉框选择器
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

url = "https://www.iviewui.com/view-ui-plus/component/form/select"

option = webdriver.ChromeOptions()
option.add_argument(r"user-data-dir=C:\Users\Mercedes\AppData\Local\Google\Chrome\User Data")
driver = webdriver.Chrome(options=option)
driver.get(url)
driver.find_elements(By.CSS_SELECTOR,"div.ivu-select-selection")[1].click()
driver.find_elements(By.XPATH,"//li[text()='Paris']")[0].click()
time.sleep(3)

级联选择器定位

也可模拟人类操作。找到元素->点击重复此过程


日期选择器定位

其实可以定位到该元素,一般为input标签,然后send_keys()。

区间日期也可以通过send_keys()


弹框定位

一般有三种样式

alert普通提醒弹框

confirm带取消确定的弹框

python 复制代码
driver.switch_to.alert.dismiss()

prompt带输入框的弹框

python 复制代码
driver.switch_to.alert.send_keys()

文件上传自动化

若是input标签的上传按钮,可直接send_keys(r"")来发送文件绝对路径,然后点击上传按钮

python os包:

os.path.dirname() 该函数用于获取当前路径的上一级路径。

os.path.realpath(file) file__相当于C语言中的内置宏__FILE

os.path.join() 后面跟多参数,参数表示目录


文件下载自动化

可以自定义下载路径。

以下是os模块种检测是否存在某个文件或目录并将其删除的代码

通过点击下载按钮

python 复制代码
#select下拉框选择器
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

url = "https://registry.npmmirror.com/binary.html?path=chromedriver/"

option = webdriver.ChromeOptions()
option.add_argument(r"user-data-dir=C:\Users\Mercedes\AppData\Local\Google\Chrome\User Data")
prefs = {"download.default_directory": "C:\\Users\\Mercedes\\PycharmProjects\\WebAutoTest\\file"}
option.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=option)
driver.get(url)
time.sleep(3)
driver.find_element(By.CSS_SELECTOR,'a[href="https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE"]').click()
time.sleep(10)

iframe框架切换

frame标签、frameset标签、iframe标签。类似安卓中的fragment

frame一般结合frameset一起使用。

用于网页元素嵌套或者网页的元素之间分隔。

找到输入框调用clear方法用于清空输入框中的内容。

点击iframe中的元素需要转换到frame模式:frame中的参数可以为id,name,也可以为index,也可以为我们已经找到的元素变量

python 复制代码
driver.switch_to.frame()

其余知识点

driver.implicitly_wait(10) 超时等待元素出现时间,每隔半秒查询一次是否存在该元素


获取元素属性值

python 复制代码
element = wd.find_element(By.ID, 'input_name')
print(element.get_attribute('class'))

获取整个元素对应的HTML

要获取整个元素对应的HTML文本内容,可以使用

python 复制代码
element.get_attribute('outerHTML')

如果,只是想获取某个元素 内部 的HTML文本内容,可以使用

python 复制代码
element.get_attribute('innerHTML')

获取输入框里面的文字

python 复制代码
element.get_attribute('value')

有时候,元素的文本内容没有展示在界面上,或者没有完全完全展示在界面上。 这时,用WebElement对象的text属性,获取文本内容,就会有问题。

出现这种情况,可以尝试使用

python 复制代码
element.get_attribute('innerText')

或者

python 复制代码
 element.get_attribute('textContent')

使用 innerText 和 textContent 的区别是,前者只显示元素可见文本内容,后者显示所有内容(包括display属性为none的部分)


CSS根据tag_name选择元素

python 复制代码
driver.find_element(By.CSS_SELECTOR,'[tag_name]')

如果 元素2元素1 的 后代元素, CSS Selector 选择后代元素的语法是这样的

元素1 元素2 中间隔一个或多个空格

后代元素:包含在内部,但不是直接子元素


CSS 选择器 可以指定 选择的元素要 同时具有多个属性的限制,像这样

python 复制代码
div[class=misc][ctype=gun]

CSS选择 组合使用

python 复制代码
.footer1 > .copyright
python 复制代码
div.footer1 > span.copyright

以上两种同样效果


操作另一个窗口中的元素

python 复制代码
driver.switch_to.window(handle)

handle为

python 复制代码
driver.window_handles

以下获取的是浏览器的名字

python 复制代码
driver.name

保存当前窗口句柄

python 复制代码
originHandle = driver.current_window_handle

select多选框

python 复制代码
# 创建Select对象
select = Select(wd.find_element(By.ID, "ss_multi"))

# 清除所有 已经选中 的选项
select.deselect_all()

ActionChains类

鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等

引入:

python 复制代码
from selenium.webdriver.common.action_chains import ActionChains
python 复制代码
# 鼠标移动到 元素上
ac.move_to_element(
    driver.find_element(By.CSS_SELECTOR, '[name="tj_briicon"]')
).perform()
python 复制代码
driver.execute_script("arguments[0].scrollIntoView({block:'center',inline:'center'})", job) 

job为js对象


冻结页面

浏览器控制台输入运行

python 复制代码
setTimeout(function(){debugger}, 5000)

获取窗口大小

python 复制代码
driver.get_window_size()

改变窗口大小

python 复制代码
driver.set_window_size(x, y)

获取当前窗口的url地址

python 复制代码
driver.current_url

截屏

有的时候,我们需要把浏览器屏幕内容保存为图片文件。

比如,做自动化测试时,一个测试用例检查点发现错误,我们可以截屏为文件,以便测试结束时进行人工核查。


手机模式

python 复制代码
from selenium import webdriver

mobile_emulation = { "deviceName": "Nexus 5" }

options = webdriver.ChromeOptions()

options.add_experimental_option("mobileEmulation", mobile_emulation)

driver = webdriver.Chrome(options=options)

driver.get('http://www.baidu.com')

input()
driver.quit()

非input标签的文件上传

python 复制代码
pip install pypiwin32
python 复制代码
# 找到点击上传的元素,点击
driver.find_element(By.CSS_SELECTOR, '.dropzone').click()

sleep(2) # 等待上传选择文件对话框打开

# 直接发送键盘消息给 当前应用程序,
# 前提是浏览器必须是当前应用
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")

# 输入文件路径,最后的'\n',表示回车确定,也可能时 '\r' 或者 '\r\n'
shell.Sendkeys(r"h:\a2.png" + '\n')
sleep(1)

元素内部使用XPath选择

要在某个元素内部使用xpath选择元素, 需要 在xpath表达式最前面加个点

像这样

elements = china.find_elements(By.XPATH, './/p')
相关推荐
行然梦实9 分钟前
学习日记_20241110_聚类方法(K-Means)
学习·kmeans·聚类
马船长14 分钟前
制作图片木马
学习
秀儿还能再秀26 分钟前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
WCF向光而行31 分钟前
Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)
笔记·学习
wang09071 小时前
工作和学习遇到的技术问题
学习
幸运的星竹1 小时前
使用pytest+openpyxl做接口自动化遇到的问题
python·自动化·pytest
Li_0304062 小时前
Java第十四天(实训学习整理资料(十三)Java网络编程)
java·网络·笔记·学习·计算机网络
心怀梦想的咸鱼2 小时前
ue5 蓝图学习(一)结构体的使用
学习·ue5
kali-Myon2 小时前
ctfshow-web入门-SSTI(web361-web368)上
前端·python·学习·安全·web安全·web
龙中舞王3 小时前
Unity学习笔记(4):人物和基本组件
笔记·学习·unity