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

主要框架及技术

1.第一个selenium例子

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定位

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


5.通过LINK_TEXT或者PARTIAL_LINK_TEXT

主要用来定位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标签)通过模拟人类使用方式:

#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带取消确定的弹框

driver.switch_to.alert.dismiss()

prompt带输入框的弹框

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模块种检测是否存在某个文件或目录并将其删除的代码

通过点击下载按钮

#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,也可以为我们已经找到的元素变量

driver.switch_to.frame()


其余知识点

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


获取元素属性值

element = wd.find_element(By.ID, 'input_name')
print(element.get_attribute('class'))

获取整个元素对应的HTML

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

element.get_attribute('outerHTML')

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

element.get_attribute('innerHTML')


获取输入框里面的文字

element.get_attribute('value')

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

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

element.get_attribute('innerText')

 或者

 element.get_attribute('textContent')

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


CSS根据tag_name选择元素

driver.find_element(By.CSS_SELECTOR,'[tag_name]')

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

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

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


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

div[class=misc][ctype=gun]

CSS选择 组合使用

.footer1 > .copyright
div.footer1 > span.copyright

以上两种同样效果


操作另一个窗口中的元素

driver.switch_to.window(handle)

handle为

driver.window_handles

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

driver.name

保存当前窗口句柄

originHandle = driver.current_window_handle

select多选框

# 创建Select对象
select = Select(wd.find_element(By.ID, "ss_multi"))

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

ActionChains类

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

引入:

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

job为js对象


冻结页面

浏览器控制台输入运行

setTimeout(function(){debugger}, 5000)

获取窗口大小

driver.get_window_size()

改变窗口大小

driver.set_window_size(x, y)

获取当前窗口的url地址

driver.current_url

截屏

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

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


手机模式

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标签的文件上传

pip install pypiwin32
# 找到点击上传的元素,点击
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')
  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay/.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值