一、回顾
1、close和quit的区别
close是关闭当前标签页
quit是关闭浏览器打开的所有页
2、代码未添加注释
3、元素的定位应用
element not interacble定位的元素无法进行交互
id = kw的元素,无法支持send_keys操作??
二、selenium的基础,如何基于webdriver实现的自动化交互原理,底层代码运用
所有的ui层的自动化都是基于元素定位来实现的。
所有的被操作元素,都是webelement对象
一个页面虽然有很多标签,实际系统中,元素的标签类型不是由表象来决定的,是通过css样式表来决定的。
自动化时,就是基于标签的属性来定位标签
如何定位精准你需要操作的元素:
八种元素定位定位法则
1、ID 基于元素属性中id的值来进行定位 运用多
2、name 类似于人们身份证上的姓名 运用比较多
3、link text :主要基于超链接进行定位
4、partial link text :link text的模糊查询版本,类似于数据库操作的模糊查询like %
当模糊查询匹配到多个符合条件的元素,选取第一个
5、classname 基于元素样式来进行定位,非常容易遇到重复的,不推荐使用
6、tagname 标签名来进行定位,只有在重复度最高时才使用,需要定位后进行二次筛选的操作
7、CssSelector 应用相对较多的一种行为,最初最IE不支持
8、xpath 目前应用最多的一种行为,谷歌和火狐都支持的一种
绝对路径:/html/body/div[3]/div/div[2]/a/img 可以直接复制
相对路径: 基于匹配制度来查找元素 例如://*[@id='kw']
//表示根路径下开始查找
* 任意元素
[ ]表示筛选条件(查找元素)
@表示基于属性来筛选,这里是id值为kw 的条件来筛选
1)相对路径+索引方式 //form/span[1]/input
2)相对路径+属性定位 //input[@autocomplete='off']
3)相对路径+通配符 //*[@autocomplete='off']
//*[@*='off'] 复制xpath经常会出错,不是万能的
4)相对路径+部分属性值定位
以开头://*[start-with(@autocomplete,'of')]
以结尾://*substring[@autocomplete,2)='ff']
包含://*[contents(@complete,'of')]
5)相对路径+文本定位 //sapn[text()='按图片搜索']
问题:确认xpath路径是否正确?
1、开发者工具elements页面使用Ctrl+f,进行判断
2、在control中输入$x()进行校验
如果要基于文本来定位元素,例如:
//a[text()=“登录”] //a[contains(text(),'登录')]
通过ChroPath工具自动是生成相对路径表达式。
通过子级返回到父级 在后面加 "/.."
linux是"../"
contains()函数
通过父级定位到子级,例如/div/input
练习:手写Xpath
1.上次商城
2.基于网易云音乐实现一次登录操作自动化
http://music.163.com
当遇到了动态元素,就用父级定位到子级,或者子级定位到父级
三、selenium+三大等待
等待的作用:为了提高自动化运行的成功率
自动化是由机器来进行操作,将手工测试所执行内容转换为机器执行,在指定的地方,进行等待,以便于系统响应,在继续执行
1、强制等待
所有自动化学习者,最先接触的等待都是强制等待(sleep)
作用:当代码运行到强制等待这一行的时候,无论出于神门情况,都强制等待指定时间
需要导入强制等待from time import sleep
优势:简单入门
缺点:只能够对单次生效,无法做有效的判断
2、隐式等待
藏起来的等待,一次设置,针对当下的的webdriver对象
例如:driver.implicitly_wait()方法
作用:对webdriver对象设置全局等待,每一次操作,如遇到了页面加载,默认进入隐式等待
优点:设置一次即可,二期不会报错。
缺点:必须等待页面加载完成才能进入到后续的操作,或者等待超时再进入后续等待。
3、显式等待
光明正大的灯,专门用于等待指定的元素对象
通过导入
from selenium.webdriver.support.wait import webdriverwait
优点:用于指定的某一个元素进行等待
缺点:必须声明一次只能对一个生效。复杂程度相对其他两个较高
当多个等待一同被调用时,系统的等待时间取决于最长的等待时间。
四、自动化过程中避免的坑:
1、元素找不到(考虑是否有iframe和句柄的切换,元素定位技术不熟练,等待添加是否合理)
2、代码莫名其妙报错
3、不清楚什么时候该用什么技术
五、如果定位不到元素?
1、元素没有加载完成
2、Frame中
3、元素不可以用,不可读、不可见
3、动态属性、动态的DIV层
前提:需要定位的元素或它的属性必须要唯一