zoukankan      html  css  js  c++  java
  • 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--

  • 相关阅读:
    Android项目实战(五十五):部分机型点击home再点图标进入程序不保留再之前界面的问题
    Android项目实战(五十四):zxing 生成二维码图片去除白色内边距的解决方案
    关于RecyclerView嵌套导致item复用异常,界面异常的问题
    191114
    191112
    191111
    191110
    191109
    191108
    191107
  • 原文地址:https://www.cnblogs.com/RuiRuia/p/12170375.html
Copyright © 2011-2022 走看看