目标
1、掌握xpath和CSS元素定位方
2、掌握元素及浏览器操作
1 xpath元素定位
1.1 什么是xpath
总结:xpath是用来在xml文件中进行元素定位的标记语言,html是一种特殊的xml,所以xpath也可以用在html中
1.2 Xpath定位策略
- 路径定位
- 属性定位
- 属性与逻辑结合
- 属性与层级结合
1.2.1 路径定位
-
绝对路径 表达式是以 /html开头,元素的层级之间是以 / 分隔
相同层级的元素可以使用下标,下标是从1开始.
需要列出元素所经过的所有层级元素 , 工作当中, 一般不使用绝对路径
例:/html/body/div/fieldset/form/p[1]/input
-
相对路径 匹配任意层级的元素, 是以 //tag_name或者//* 开头
也可以使用下标,下标是从1开始。
例子://p[5]/button
# 通过xpath的绝对路径定位用户名输入框并输入admin
driver.find_element_by_xpath("/html/body/div/fieldset/form/p/input").send_keys("admin")
# 等待3S
time.sleep(3)
# 通过xapth的相对路径定位密码输入框并输入123
driver.find_element_by_xpath("//form/p[2]/input").send_keys("123")
1.2.2 元素属性定位
- //*或者//tag_name //*[@attribute='value'] # attribute表示的是元素的属性名,value表示的是元素对应属性值
driver.find_elemet_by_xpath("//*[@placehoulder ='请输入用户名']").send_keys('admin')
1.2.3 属性与逻辑结合定位
- //* 或者//tag_name 开头 //*[@attribute1='value1' and @attribute2='value2']
driver.find_element_by_xpath("//input[@name ='user' and @class= 'login']").sendkeys('admin')
1.2.4 属性与层级结合定位
-
是以//*或者//tag_name开头 //p[@id='pa']/input
在任意层级当中,都可以结合属性来使用
driver.find_element_by_xpath("//p[@id='p1']/input").send_keys("admin")
1.2.5 XPATH扩展
//*[text() = 'value'] value表示的是要定位的元素的全部文本内容.
-
//*[contains(@attribute,'value')] attribute表示的属性名称, value表示的是字符串
要定位的元素中,attribute属性的属性值包含了value的内容。
-
//*[starts-with(@attribute,'value')] attribute表示的属性名称, value表示的是字符串
要定位的元素,attribute属性的属性值是以value开头
2、CSS定位
2.1 什么是CSS
总结:css是可以用来在selenium中定位元素的
CSS定位元素的方法: find_element_by_css_selector(css_selector) # css_selector表示的是CSS选择器表达式
2.2 CSS定位策略
- id选择器
- class选择器
- 元素选择器
- 属性选择器
- 层级选择器
2.2.1 id选择器
- 表达式: #id # 表示通过元素的ID属性进行元素选择 id 表示的的id属性的属性值
driver.find_element_by_css_selector('#user').send_keys('admin')
2.2.2 class选择器
- 表达式: .class # .表示通过元素的class属性进行元素选择, class表示的class属性的其中一个属性值
driver.find_element_by_css_selector('.email').send_keys('123@qq.com')
2.2.3 元素选择器
- 就是通过元素标签名称来选择元素 。表达式: tag_name 不推荐使用
2.2.4 属性选择器
- 就是通过元素的属性来选择元素。 表达式:[attribute='value'] #attribute 表示的是属性名称,value表示的是属性值
如果使用的是class属性,需要带上class的全部属性值
driver.find_element_by_css_selector("input").send_keys("admin")
# 通过css的属性选择器定位电子邮箱输入框,输入123@qq.com
driver.find_element_by_css_selector("[class='emailA dzyxA']").send_keys("123@qq.com")
-
父子层级关系选择 器
- 表达式: element1>element2 通过element1来找element2并且element2是element1的直接子元素
-
隔代层级关系选择器
- 表达式: element1 element2 通过element1来找element2并且element2是element1的后代元素
driver.find_element_by_css_selector('.zc #userA').send_keys('admin')
2.2.6CSS扩展
-
input[type^='value'] input表示标签名称,type表示属性名称, value表示的文本内容
查找元素type属性值是以value开头的元素
-
input[type$='value'] input表示标签名称,type表示属性名称, value表示的文本内容
查找元素type属性值以value结尾的元素
-
input[type*='value'] input表示标签名称,type表示属性名称, value表示的文本内容
查找元素type属性值包含value的元素
4、定位元素的另外一种写法
- find_element(By.ID, id) 需要导入By类。
二、元素操作及浏览器操作方法
1、元素操作
- 点击操作 element.click() element表示的是元素对象
- 输入操作 element.send_keys("value") element表示的是元素对象, value表示的是要输入的内容
- 清除操作 element.clear() element表示的是元素对象. 将输入框里面的内容全部清除
import time
from selenium import webdriver
frome senlenium,webdriver.common.by import By
driver = webdriver.Chrome()
# 打开测试网站
driver.get('' ")
driver.find_element(By.ID,'userA').send_keys('admin')
driver.find_element(By.ID, 'passwordA').send_kes('123456')
driver.find_element(By.XPATH, "//*[@class='emailA dzyxA']").send_keys("123@qq.com")
# 2).间隔3秒,修改电话号码为:18600000000
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, ".telA").clear()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18600000000")
# 等待3S
time.sleep(3)
# 退出
driver.quit()
2、浏览器操作
- 浏览器常用操作方法
maximize_window() 最大化浏览器窗口 --> 模拟浏览器最大化按钮 实例化浏览器驱动之后,就可以调用窗口最大化的方法
set_window_size(width, height) 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)
-
set_window_position(x, y) 设置浏览器窗口位置 --> 设置浏览器位置
x,y是一个坐标点,通过此坐标点确定浏览器最左上角的位置,以此确定浏览器在屏幕上的位置。
x, y不能超过屏幕的分辨率大小
# 导包
import timefrom selenium import webdriver
# 创建浏览器驱动对象
from selenium.webdriver.common.by
import By
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 打开测试网站
driver.get("file:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")time.sleep(3)
# 设置窗口大小
driver.set_window_size(500, 500)
time.sleep(3)
# 设置窗口位置
driver.set_window_position(300, 300
)# 等待
3Stime.sleep(3)
# 退出
driver.quit()
- back() 后退 --> 模拟浏览器后退按钮
- forward() 前进 --> 模拟浏览器前进按钮
- refresh() 刷新 --> 模拟浏览器F5刷新
- close() 关闭当前窗口 --> 模拟点击浏览器关闭按钮
- quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
driver.back()
driver.forward()
driver.find_element(By.XPATH, "//*[text()='访问 新浪 网站']").click()
driver.close()
driver.quit()
- title 获取页面title
- current_url 获取当前页面URL
3、获取元素信息
-
为什么要学习获取元素信息的方法
主要为了获取相关的信息进行断言,判断自动化用例最终的执行结果。
-
获取元素常用的方法:
- size 获取元素的大小 返回的是一个字典,里面包含 元素高度和宽度的值
- text 获取元素的文本内容
- get_attribute("attribute") 获取元素对应属性名称的属性值 , attribute表示的是属性名
#1. 获取用户名输入框的大小
driver.find_element(By.ID,'userA').size
#2. 获取页面上第一个超链接文本的内容
driver.find_element(By.LINK_TEXT,'新浪').text
#3. 获取第一个超链接的地址
driiver.find_element(By.LINK_TEXT.'新浪').get_attribute('href')
- is_displaye() 判断元素是否可见 返回值为true 或者false
- is_enabled() 判断元素是否可用,返回值true或者false
- is_selected() 判断复选框或者单选框是否被选中,返回值为true或者false
# 4. 判断span元素是否可见,
print(driver.find_element(By.Name, 'sp1').is_dispalyed())
# 判断取消按钮是否可用
print(driver.find_element(By.ID, 'cancelA').is_enabled())
# 判断页面中’旅游‘对应的复选框是否选中状态
print(driver.find_element(By.ID, 'lyA').is_selected())