【VIP软件测试教程】Selenium自动化测试零基础入门宝典,白嫖不后悔!_哔哩哔哩_bilibili
久等了!150集Python自动化测试开发全栈付费教程!(软件测试入门+项目实战+简历优化)_哔哩哔哩_bilibili
元素定位:
所有的ui层的自动化都是基于元素定位实现的
所有的被操作的元素都是WebElement对象
元素 = HTML标签
基本格式:
<tagName attribute1="" attribute2>text</tagName>
<tagName attribute1="" attribute2 /tagName>
自动化,就是基于标签的属性来操作
八种元素定位:
id | driver.find_element_by_id()或者driver.find_element(By.ID, 'id') |
name | driver.find_element(By.NAME, 'name') |
link_text | driver.find_element(By.LINK_TEXT, 'text') 主要用于超链接进行定位 |
partial_link_text | link_text的模糊查询,类似数据库的like %,查到多个元素选取第一个 |
tagname | 重复度最高,只有在需要定位后进行二次筛选的情况下使用 |
classname | 基于元素样式进行定位,非常容易重复 |
css | 应用较多,因为IE最初不支持xpath,完全基于class属性实现定位 |
xpath | 目前应用最多,基于页面结构来进行定位 |
xpath 绝对路径:/html/body/div[4]/div/div/div/div[2]/div/div/div[1]/form/div[1]/input
较为麻烦,不推荐
相对路径:基于匹配机制来查找元素,依照xpath语法结构来走
例: //*[@id="kw"]
// 表示从根路径下开始查找
* 任意元素
[] 表示筛选条件(查找函数)
@ 表示基于属性来筛选,例如id = "kw"表示基于id属性值为kw的条件来筛选
确认xpath路径是否正确:
- 在开发者工具elements页面使用ctrl+f查找,进行判断
- 在console中输入$x()进行校验
如果要基于text来确定元素,在[]中添加text()="文本内容"进行查找,例如://a[text()=’登录‘]
当你定位元素时,无法直接定位一个元素,可以通过定位子级元素然后返回父级元素,[]后加 /..
//input[contains(@id, 'kw')] ,contains表示进一步查找,匹配项模糊查找
上传文件时输入的是文件的路径
实现Chrome浏览器网易云音乐页面的自动登录
"""
网易云音乐的自动化登录
"""
# 导入WebDriver模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# 导入强制等待
from time import sleep
# 创建chrome浏览器对象
driver = webdriver.Chrome()
# 访问指定的URL
driver.get('https://music.163.com/')
driver.maximize_window() # 最大化窗口
sleep(2) # 等待是为了让代码成功率更高
# 执行登录流程
driver.find_element(By.XPATH, '//*[@id="g-topbar"]/div/div/div/a').click() # 登录
sleep(1)
driver.find_element(By.XPATH, '//*[@id="otherbtn"]/a').click() # 选择其他登陆模式
driver.find_element(By.XPATH, '//*[@id="j-official-terms"]').send_keys(Keys.SPACE) # 勾选协议
driver.find_element(By.LINK_TEXT, 'QQ登录').click() # 选择QQ登录
# 句柄的处理
"""
在计算机世界里,不同的标签页是通过不同的字符串来区分,可以理解为id
在selenium操作的标签页中,在不切换的情况下,只会一直聚焦在第一个标签页
如果要操作新的标签页就切换句柄
原则:
1.在selenium自动化时,尽可能保持有且最多有两个页面存在
2.如果页面会自动关闭,就不需要额外执行close
3.如果自动关闭后,仍需操作其他页面,需要切换句柄。
"""
handles = driver.window_handles # 获取当前所有的句柄
print(handles)
driver.switch_to.window(handles[1]) # 切换到第二个句柄页
sleep(3)
"""
iframe是一个窗体内嵌页面,本身是一个独立的html页面存在。本质上是个套娃。。。
对于iframe内的元素如果要操作,是没有办法直接定位的
遇到死活定位不到的元素,就检查下是不是一个iframe,如果是,切换iframe后再定位
切换进去iframe后,无法操作iframe以外的内容,如果要操作原窗体内容,需要重新返回默认窗体
"""
# 切换iframe:有id直接传入id,没有id通过元素定位,传递元素进去
# frame1 = driver.find_element('id', 'ptlogin_iframe')
# driver.switch_to.frame(frame1)
driver.switch_to.frame('ptlogin_iframe')
# QQ快捷登录
driver.find_element(By.XPATH, '//*[@id="img_out_2040755107"]').click()
sleep(2)
# 返回默认窗体
driver.switch_to.default_content()
handles = driver.window_handles
print(handles)
# 切换回网易云主页句柄
driver.switch_to.window(handles[0])
print(driver.title)
# 结束进程
sleep(3)
driver.quit()