Selenium+Python3的web自动化测试(二)
本文章内容参考了白夜黑羽教python的教程,出处为http://www.python3.vip/doc/tutorial/selenium/01/
感谢上方大佬!
所整理的正文如下:
首先,在搭建好Selenium+Python3的环境基础上,测试要点如下:
1.使用CSS Selector选择元素
1 """用CSS Selector来代替id,class,tag查找""" 2 3 #element = wd.find_element_by_id('animal') 4 element = wd.find_element_by_css_selector('#animal') 5 #注意用id方法查找需要加一个#号 6 7 #elements = wd.find_elements_by_class_name('animal') 8 elements = wd.find_elements_by_css_selector('.animal') 9 #注意用class方法查找需要加一个. 10 11 elements = wd.find_elements_by_tag_name('div') 12 elements = wd.find_elements_by_css_selector('div') 13 #用tag方法查找直接写tag名即可,与原tag查找方法相同
2.关于CSS Selecter选择子元素的语法
1 #元素2是元素1的直接子元素,最终选择元素2 2 元素1 > 元素2 3 4 #后一个元素为前一个的直接子元素,最终选择元素4 5 元素1 > 元素2 > 元素3 > 元素4 6 7 #元素2是元素1的后代元素(后代元素包含直接子元素和间接子元素),中间是一个或者多个空格隔开,最终选择的元素是元素2 8 元素1 元素2 9 10 #上一个的多层级选择表示方法(最终选择元素4) 11 元素1 元素2 元素3 元素4
3.根据属性选择CSS Selector
1 #选择属性值herf为http://www.miitbeian.gov.cn 的元素 2 element = wd.find_element_by_css_selector('[href="http://www.miitbeian.gov.cn"]') 3 4 """选择属性值包含某个字符串的元素""" 5 6 #比如, 要选择a节点,里面的href属性包含了 miitbeian 字符串 7 a[href*="miitbeian"] 8 9 #选择属性值以某个字符串开头的元素,比如,要选择a节点,里面的href属性以http开头 10 a[href^="http"] 11 12 #选择属性值以某个字符串结尾的元素,比如,要选择a节点,里面的href属性以gov.cn结尾 13 a[href$="gov.cn"] 14 15 #如果一个元素具有多个属性如 <div class="misc" ctype="gun">沙漠之鹰</div> 16 #可以指定 选择的元素要 同时具有多个属性的限制 17 div[class=misc][ctype=gun]
4.验证CSS Selector语法选择的是所需要选择的正确元素的快捷方法
举个栗子:
使用Chrome浏览器打开 http://f.python3.vip/webauto/sample1.html ,按F12 打开 开发者工具栏
如果我们要验证 下面的表达式
1 #bottom > .footer2 a
能否选中 <a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>
做法:
点击Elements 标签后, 同时按 Ctrl 键 和 F 键, 就会出现下图箭头处的 搜索框
输入要验证的CSS Selector表达式,如果能选择到元素, 右边的的红色方框里面就会显示出类似 2 of 3
这样的内容。
of 后面的数字表示这样的表达式 总共选择到几个元素
of 前面的数字表示当前黄色高亮显示的是 其中第几个元素
上图中的 1 of 1
就是指:
CSS 选择语法 #bottom > .footer2 a
在当前网页上共选择到 1 个元素, 目前高亮显示的是第1个。
5.选择语法的联合使用
比如, 我们要选择 网页 html 中的元素 <span class='copyright'>版权</span>
1 <div id='bottom'> 2 <div class='footer1'> 3 <span class='copyright'>版权</span> 4 <span class='date'>发布日期:2018-03-03</span> 5 </div> 6 <div class='footer2'> 7 <span>备案号 8 <a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a> 9 </span> 10 </div> 11 </div>
那么CSS selector 表达式 有三种写法:
1 div.footer1 > span.copyright 2 #就是 选择 一个class 属性值为 copyright 的 span 节点, 并且要求其 必须是 class 属性值为 footer1 的 div节点 的子节点 3 4 .footer1 > .copyright 5 #就是 选择 一个class 属性值为copyright 的节点(不限类型), 并且要求其 必须是 class 属性值为 footer1 的节点的 子节点 6 7 .footer1 .copyright 8 #因为子元素同时也是后代元素
6.同时选择多个元素(组选择)
1 #同时选择所有class为plant和class为animal的元素(css选择器可以使用逗号,称之为组选择) 2 .plant , .animal 3 4 #同时选择所有tag名为div的元素 和 id为BYHY的元素 5 div,#BYHY 6 7 #对应的selenium代码如下 8 elements = wd.find_elements_by_css_selector('div,#BYHY') 9 for element in elements: 10 print(element.text)
7.但若在同一个属性下选中其中两个后代元素,注意写法(更换测试网址为:http://f.python3.vip/webauto/sample1a.html)
1 #要选择所有 唐诗里面的作者和诗名, 也就是选择所有 id 为 t1 里面的 span 和 p 元素 2 3 #错误写法(这样写的意思是 选择所有 id 为 t1 里面的 span 和 所有的 p 元素) 4 #t1 > span,p (这里#表示id方法) 5 6 #正确写法 7 #t1 > span , #t1 > p (这里#表示id方法)
8.按顺序选择子节点(测试网址为:http://f.python3.vip/webauto/sample1a.html)
1 """父元素的第n个子节点""" 2 #我们要选择唐诗和宋词的第一个作者,也就是说选择的是第2个子元素,并且是span类型 3 span:nth-child(2) 4 #如果你不加节点类型限制 5 :nth-child(2) 6 #就是选择所有位置为第2个的所有元素,不管是什么类型 7 8 """父元素的倒数第n个子节点""" 9 #选择第倒数第1个子元素,并且是p元素 10 p:nth-last-child(1) 11 12 """父元素的第几个某类型的子节点""" 13 #要选择 唐诗 和宋词 的第一个 作者,还可以这样思考,选择的是 第1个span类型 的子元素 14 span:nth-of-type(1) 15 16 """父元素的倒数第几个某类型的子节点""" 17 p:nth-last-of-type(2) 18 19 """奇数节点和偶数节点(假设是p类型的)""" 20 #选择的是父元素的 偶数节点 21 p:nth-child(even) 22 #选择的是父元素的 奇数节点 23 p:nth-child(even) 24 #选择的是父元素的 某类型偶数节点 25 p:nth-of-type(even) 26 #选择的是父元素的 某类型奇数节点 27 p:nth-of-type(even) 28 29 30 """兄弟节点选择""" 31 #相邻兄弟节点选择,用+号 32 #选择 唐诗 和宋词 的第一个 作者,可以选择 h3 后面紧跟着的兄弟节点 span 33 h3 + span 34 #后续所有兄弟节点选择,用~号 35 #选择 h3 后面所有的兄弟节点 span 36 h3 ~ span
9.使用XPath选择元素(目前XPath有1.0和2.0,浏览器支持的是1.0)
- XPath验证元素的选择是否正确(也可以用这种方式来确定元素位置)用F12-->组合键 Ctrl + F,和CSS的验证方法相同。
- 根节点用 "/" 表示,“/html”表示选择根节点下的html节点
- 节点之间的分隔用 "/" 表示,“/html/body/div”表示选择html下body下的div元素(这个例子是绝对路径的表达方式)
- XPath中的 "/" 类似CSS中的 ">"
- 相对路径的表达方式:从当前节点往下寻找所有的后代元素如div,那么写为 “//div”
- 相对路径的多层表达方式:
- 要选择 所有的 div 元素里面的 所有的 p 元素 ,不管div 在什么位置,也不管p元素在div下面的什么位置,可以写为“//div//p”
- 要选择 所有的 div 元素里面的 直接子节点 p,可以写为“//div/p”
- 通配符为 " * "
- 根据属性选择,格式为
[@属性名='属性值']
,属性名前有@,属性值的引号可以是单引号也可以是双引号 - 根据id属性选择:
//*[@id='west']
- 根据class属性选择:
//select[@class='single_choice']
这是选择了所有select元素中class为single_choice的元素 - 根据class属性选择时,如果一个元素有多个class元素如
class='capital huge-city'
,那么选这个属性时要把class内容写完整,不能只写其中一个 - 根据其他属性选择: 比如选择 具有multiple属性的所有页面元素 ,写为
//*[@multiple]
- 选择 style属性值 包含 color 字符串的 页面元素 ,可以这样
//*[contains(@style,'color')]
- 选择 style属性值 包含 color 字符串的 页面元素 ,可以这样
//*[contains(@style,'color')]
- 选择 style属性值 以 某个 字符串 结尾 的 页面元素 ,推测是
//*[ends-with(@style,'color')]
, 但这是xpath 2.0 的语法 ,目前浏览器都不支持 - 按次序选择,如选择的是
p类型第2个的子元素
,写为//p[2]
- 按次序选择,如选取p类型倒数第1个子元素,写为 //p[last()] ; 如选取p类型倒数第2个子元素,写为 //p[last()-1]
- 按范围选择,如选取option类型第1到2个子元素,写为 //option[position()<=2] 或者 //option[position()<3]
- 按组选择(用 | 隔开多个表达式 ),要选所有的option元素 和所有的 h4 元素,写为 //option | // h4
- 选择父节点(本元素无特征和属性,但子节点有的情况下,可由子节点选到父节点,并且可继续选到父节点的父节点),某元素的父节点用 /.. 表示,如要选择 id 为 china 的节点的父节点,写为
//*[@id='china']/..
- 选择兄弟节点
- 后续兄弟节点,用语法
following-sibling::
如要选择 class 为 single_choice 的元素的所有后续兄弟节点//*[@class='single_choice']/following-sibling::*
要选择后续节点中的div节点, 就应该这样写//*[@class='single_choice']/following-sibling::div
- 前面的兄弟节点,用语法
preceding-sibling:: 如,要选择 class 为 single_choice 的元素的所有前面兄弟节点
//*[@class='single_choice']/preceding-sibling::*
- 后续兄弟节点,用语法
1 """选择示例网页中,id是china的元素,然后通过这个元素的WebElement对象,使用find_elements_by_xpath,选择里面的p元素""" 2 3 # 先寻找id是china的元素 4 china = wd.find_element_by_id('china') 5 6 # 再选择该元素内部的p元素 7 elements = china.find_elements_by_xpath('//p') 8 9 # 打印结果 10 for element in elements: 11 print('----------------') 12 print(element.get_attribute('outerHTML')) 13 14 #运行发现,打印的 不仅仅是 china内部的p元素, 而是所有的p元素。 15 #要在某个元素内部使用xpath选择元素, 需要 在xpath表达式最前面加个点,如下: 16 #elements = china.find_elements_by_xpath('.//p')
--end--