主要框架及技术
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定位
一般表单有这个属性,用法与上面类似。实际用得也不多
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标签)通过模拟人类使用方式:
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')