当前页面唯一
当前页面允许重复
属性值可以有多个
1、如果标签没有(id/name/class)3个属性,也不是链接标签,只能使用tag_name定位,比较麻烦。
2、方便在工作中查找元素,使用xpath和css比较方便(支持任意属性、层级)来查找元素
说明:xpath是xml path 简称,使用标签路径来定位。
绝对路径:对界面依赖强,不建议使用
概念:从最外层元素到指定元素之间所有经过的元素层层级的路径。
表达式写法:绝对路径以/html根节点开始,使用/来分隔元素层级,例如:/html/body/div/fieldset/p[1]/input
相对路径:
概念:从目标定位元素的任意层级的上级元素开始到目标无素所经过的层级的路
表达式写法:以//开始,后续每个层级都使用/来分隔,例如://div[1]/input
1、路径
2、属性
3、属性与逻辑(多个属性)
4、属性与层级(路径)
方法:driver.find_element_by_xpath("xpath路径表达式")
实现:
#绝对路径
el = driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/form/div/div[1]/input")
el.send_keys("111111")
time.sleep(2)
#清除内容
el.clear()
#相对路径
el = driver.find_element_by_xpath("//div[1]/input")
el.send_keys("admin")
#清除内容
//*[@属性名='属性值']
//*[@属性名='属性值'and@属性名='属性值']
#单个属性
driver.find_element_by_xpath("//*[@id='username']").send_keys("111111")
time.sleep(2)
#多个属性
driver.find_element_by_xpath("//*[@id='username' and @placeholder='手机号/邮箱' ]").send_keys("admin")
如果元素现有的属性不能唯一匹配,需要结合层级使用
//父标签/子标签
必须为直属子级//父标签[@属性='值']//后代标签
父和后代之间可以跨越元素#点击登录链接 文本
driver.find_element_by_xpath("//*[text()='登录']").click()
#输入用户名 属性
driver.find_element_by_xpath("//*[@placeholder='手机号/邮箱']").send_keys('18886007825')
#密码 包含
driver.find_element_by_xpath("//input[contains(@placeholder,'密码')]").send_keys('123456')
#验证码 多属性
driver.find_element_by_xpath("//*[@placeholder='验证码' and @name='verify_code']").send_keys('8888')
#登录按钮 层级
driver.find_element_by_xpath("//*[@class='login_bnt']/a").click()
说明:css选择器是html查找元素的工具
策略:
1、id选择器
2、类选择器
3、标签选择器
4、属性选择器
5、层级选择器
id选择器
#id属性
标签必须有id属性
类选择器
**.class属性值**
标签必须有class属性
标签选择器
标签名
注意标签是否在页面中唯一,否则返回单个或所有
属性选择器
[属性名='属性值']
标签任意属性都可以
层级选择器
选择器>选择器
选择器 选择器
选择器使用任何一种css选择器(id选择器、类选择器、标签选择器和属性选择器)都可以
案例:
#3、查找操作元素
#用户名 id选择器->#id属性
driver.find_element_by_css_selector('#username').send_keys("18887657869")
#验证码 父子关系:选择器>选择器
driver.find_element_by_css_selector(".liner>[name='verify_code']").send_keys('8888')
#密码 属性选择器->[属性名='属性值']
driver.find_element_by_css_selector('[id="password"]').send_keys("123456")
#确认密码
driver.find_element_by_css_selector("[id='password2']").send_keys("123456")
#电话 类选择器->.class
driver.find_element_by_css_selector(".liner [name='invite']").send_keys("18879081234")
#确定 标签选择器->标签名
driver.find_element_by_xpath("//*[text()='同意协议并注册']").click()
time.sleep(2)
首推css定位,原因是执行速度快。
如果css解决不了,使用xpath。
1、操作方法
2、获取方法
元素=driver.find_element()
方法
元素.size
元素.text
元素.get_attribute("属性名")
元素.is_displayed()
元素.is_enabled()
元素.is_selected()
案例
#3、查找操作元素
#获取大小 元素.size
user = driver.find_element_by_css_selector("#username").size
print("用户名输入框的大小:",user)
#获取内容 元素.text
a_text = driver.find_element_by_tag_name("a").text
print("第一个a标签的文本:",a_text)
#获取属性 超链接地址
a_herf = driver.find_element_by_tag_name("a").get_attribute("herf")
print("第一个a标签的链接:",a_herf)
#判断span标签是否可见 元素.is_displayed
span = driver.find_element_by_tag_name("span").is_displayed()
print("span是否可见:",span)
#判断取消按钮是否可用 is_enabled
btn_is_enabled = driver.find_element_by_css_selector(".fn-fl>span").is_enabled()
print("取消按钮是否可用:",btn_is_enabled)
#判断是否被选中 is_selected
is_selected = driver.find_element_by_css_selector("#checktxt").is_selected()
print(is_selected)
#最大化浏览器
driver.maximize_window()
sleep(2)
#设置窗口大小
driver.set_window_size(550,700)
sleep(2)
driver.set_window_position(0,500)
sleep(2)
#点击立即注册
driver.find_element_by_xpath("//*[text()='立即注册']").click()
#后退
driver.back()
sleep(2)
#前进
driver.forward()
sleep(2)
#刷新
driver.refresh()
sleep(2)
def switch_window(title):
#1、获取所有窗口句柄
handles = driver.window_handles
#2、遍历句柄进行切换
for handle in handles:
driver.switch_to.window(handle)
#获取当前窗口title并且判断是否为自己需要的窗口
if driver.title == title:
#操作代码
return "已找到{}窗口,并且已切换成功".format(title)
#1、获取浏览器(创建浏览器驱动对象)
driver = webdriver.Chrome()
#2、输入URL,打开web页面
driver.get("http://hmshop-test.itheima.net/Home/Goods/goodsList/id/5.html")
driver.implicitly_wait(3)
title_B = "77"
driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[2]/ul/li[1]/div/div[1]/a/img").click()
#最大化浏览器
driver.maximize_window()
#获取当前窗口标题
print("当前窗口title:",driver.title)
#获取当前窗口url
print("当前窗口url:",driver.current_url)
sleep(2)
switch_window(title_B)
#将商品加入购物车
driver.find_element_by_xpath("/html/body/div[3]/div/form/div/div[8]/div/a[2]").click()
sleep(2)
#关闭当前窗口
driver.close()
#关闭浏览器驱动
sleep(2)
driver.quit()
1、使用css或xpath(推荐)
2、使用专属Select类
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
#1、获取浏览器(创建浏览器驱动对象)
driver = webdriver.Chrome()
#2、输入URL,打开web页面
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select")
driver.maximize_window()
time.sleep(1)
driver.switch_to.frame("iframeResult")
#定位下拉框元素 select
ele_select = driver.find_element_by_xpath("//select")
#实例化Select对象
select = Select(ele_select)
#使用索引选择下来内容
select.select_by_index(1)
time.sleep(1)
#使用value选择下拉内容
select.select_by_value("audi")
time.sleep(1)
#使用文本选择下拉内容
select.select_by_visible_text("Volvo")
driver.quit()
如果页面操作过程中,有弹窗出现,不处理,无法继续对页面操作。
1、js原生弹窗(Alert类型弹框、Confirm类型弹框、Prompt类型弹框),这种我们无法通过定位元素来操作,必须处理
2、开发使用标签自定义弹窗效果(不用处理,正常即可)
1、获取弹窗对象
2、调用同意或取消方法
from selenium import webdriver
driver = webdriver.Chrome()
driver.switch_to.alert.accept() #确定、同意;三种弹窗都可使用
driver.switch_to.alert.dismiss() #取消、不同意;confirm和prompt弹窗中使用
title = driver.switch_to.alert.text #打印弹窗信息
alert = driver.switch_to.alert #获取alert对象
alert.send_keys() #Prompt弹窗中输入内容
from selenium import webdriver
from time import sleep
#1、获取浏览器(创建浏览器驱动对象)
driver = webdriver.Chrome()
#2、输入URL,打开web页面
driver.get("http://sahitest.com/demo/confirmTest.htm")
#点击弹窗
driver.find_element_by_xpath("//*[@name='b1']").click()
sleep(2)
#获取弹窗对象
el = driver.switch_to.alert
#获取弹窗信息
title = driver.switch_to.alert.text
print(title)
# 处理弹窗
#el.accept()
el.dismiss()
sleep(2)
driver.quit()
1、定义js语句
2、调用执行js方法
1、方法:脚本名 = “window.scrollTo(x,y)”
x:左边距,控制左右滚动条
y:上边距,控制上下滚动条
单位:像素
边距数值:估算,不需要精确值
2、执行脚本:driver.execute_script(脚本名)
driver.set_window_size(300,300)
sleep(2)
#(0,10000)0为水平滚动条,10000为垂直滚动条
#定义js语句
#js->向下滚动
#document.body.scrollHeight:动态获取浏览器页面布局大小
js_down = "window.scrollTo(0,document.body.scrollHeight)"
#执行js方法
driver.execute_script(js_down)
sleep(2)
#js->向上滚动
js_top = "window.scrollTo(0,0)"
driver.execute_script(js_top)
1、action.move_to_element(element) 鼠标悬停
2、action.context_click(element) 鼠标右击
3、action.double_click(element) 鼠标双击
4、action.drag_and_drop(source, target) 拖拽
element:表示元素对象
action.perform():执行鼠标操作
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
#1、获取浏览器(创建浏览器驱动对象)
driver = webdriver.Chrome()
#2、输入URL,打开web页面
driver.get("https://hmshop-test.itheima.net")
#获取ActionChains对象
action = ActionChains(driver)
el = driver.find_element_by_xpath("//*[text()='箱包']")
#调用悬停方法
action.move_to_element(el).perform()
sleep(2)
#右击
action.context_click(el).perform()
sleep(2)
#双击
action.double_click(el).perform()
sleep(2)
代码执行过程中,第一次未找到元素,先不抛出异常。激活等待时间,在等待过程中如果找到元素就执行。
由于网络或配置原因,导致元素未加载出来,而代码已执行,会触发异常。
1、隐式等待
2、显式等待
3、强制等待--->time.slepp(秒)
针对全部元素生效
)driver.implicitly_wait(秒)
针对单个元素生效,可以修改查找频率和超时时间
。查找并返回元素
。from selenium.webdriver.support.wait import WebDriverWait
#显式等待:返回查找到的元素
el = WebDriverWait(driver,10,0.5).until(lambda x: x.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[2]/ul/li[1]/div/div[1]/a/img"))
el.click()
在当前页面的指定区域显示另外一个页面的内容。
一般利用id或name属性值切换,有时frame标签没有id和name,则考虑下标index和元素定位切换。
1). driver.switch_to.frame(frame_reference) #切换到指定frame的方法frame_reference:可以为frame框架的name、id或者定位到的frame元素
必须先切换回默认页面,才可以继续在默认页面进行操作
#获取注册A iframe元素
element_A = driver.find_element_by_css_selector("#idframe1")
#1、切换到A
driver.switch_to.frame(element_A)
#2、注册A操作
driver.find_element_by_css_selector("#userA").send_keys("admin")
#3、回到默认目录
driver.switch_to.default_content()
#4、获取注册B iframe元素
element_B = driver.find_element_by_css_selector("#idframe2")
#5、切换到B
driver.switch_to.frame(element_B)
#6、注册B操作
driver.find_element_by_css_selector("#userB").send_keys("admin")
1、为什么要切换?
selenium默认启动时,所有焦点在启动窗口,无法操作其他窗口的标签
2、如何切换?
1). driver.current_window_handle #获取当前窗口句柄
2). driver.window_handles # 获取所有窗口句柄
3). driver.switch_to.window(handle[n]) #切换指定句柄窗口
注意:窗口句柄是一个唯一的标识符,可以用来定位浏览器的窗口。每次你打开一个新的窗口或标签,Selenium会为其创建一个新的窗口句柄.
3、示例
#1、获取浏览器(创建浏览器驱动对象)
driver = webdriver.Chrome()
#2、输入URL,打开web页面
driver.get("http://hmshop-test.itheima.net/Home/Goods/goodsList/id/5.html")
driver.implicitly_wait(3)
print("操作之前所有的窗口句柄:",driver.window_handles)
driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[2]/ul/li[1]/div/div[1]/a/img").click()
handles = driver.window_handles
print("操作之后所有的窗口句柄:",handles)
#切换窗口
driver.switch_to.window(handles[1])
#将商品加入购物车
driver.find_element_by_xpath("/html/body/div[3]/div/form/div/div[8]/div/a[2]").click()
sleep(2)
#4、关闭浏览器驱动
driver.quit()
'''
思路:
1、获取所有窗口句柄
2、切换窗口
3、获取当前所在窗口title
4、判断title是否为需要的窗口
5、执行代码
'''
def switch_window(title):
#1、获取所有窗口句柄
handles = driver.window_handles
#2、遍历句柄进行切换
for handle in handles:
driver.switch_to.window(handle)
#获取当前窗口title并且判断是否为自己需要的窗口
if driver.title == title:
#操作代码
return "已找到{}窗口,并且已切换成功".format(title)
#1、获取浏览器(创建浏览器驱动对象)
driver = webdriver.Chrome()
#2、输入URL,打开web页面
driver.get("http://hmshop-test.itheima.net/Home/Goods/goodsList/id/5.html")
driver.implicitly_wait(3)
title_B = "77"
driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[2]/ul/li[1]/div/div[1]/a/img").click()
switch_window(title_B)
#将商品加入购物车
driver.find_element_by_xpath("/html/body/div[3]/div/form/div/div[8]/div/a[2]").click()
元素定位不到怎么办?
1、什么是截图?
当前UI页面截图保存,方便出错后,查看直观原因。
示例:
driver.get_screenshot_as_file("error_{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))