zoukankan      html  css  js  c++  java
  • selenium的定位方式

    第1种方法:通过绝对路径做定位(相信大家不会使用这种方式)

    By.xpath("html/body/div/form/input")

    By.xpath("//input")

     第2种方法:通过元素索引定位

    By.xpath("//input[4]")

    第3种方法:使用xpath属性定位

    By.xpath("//input[@id='kw1']")

    By.xpath("//input[@type='name' and @name='kw1']")

     第4种方法:使用部分属性值匹配(最强大的方法)

    By.xpath("//input[starts-with(@id,'nice')
    By.xpath("//input[ends-with(@id,'很漂亮')
    By.xpath("//input[contains(@id,'那么美')]")

    starts-with  顾名思义,匹配一个属性开始位置的关键字

    contains    匹配一个属性值中包含的字符串

    text()         匹配的是显示文本信息,此处也可以用来做定位用

    举例

    //input[starts-with(@name,'name1')]                   查找name属性中开始位置包含'name1'关键字的页面元素

    //input[contains(@name,'na')]                              查找name属性中包含na关键字的页面元素

    <a href="http://www.baidu.com">百度搜索</a>,那么xpath写法为 //a[text()='百度搜索']     或者    //a[contains(text(),"百度搜索")]

    三.有时候切换到iframe可能会遇见的问题

    当然实际情况中会遇到没有id属性和name属性为空的情况,这时候就需要先定位iframe元素对象,这里可以通过tag先定位到,也能达到同样效果。

    如下代码:

    iframe = driver.find_element_by_tag_name("iframe")

    driver.switch_to_frame(iframe)

    (1) 切换完了之后,就可以去正常定位iframe里面的元素,driver.find_element_by_tagname(table) 之类的,同时也可以用xpath的方式:例如 Xpath=//*[contains(@src, 'sysmanage/systemupgrade.action')] 

    (2) 如果有多个iframe标签,那你就要看看总共有iframe标签了,看看你所定位的iframe是数组中的第几个iframe元素(从0开始数起,基于JavaScript的),可以用chrome浏览器的F12的控制台(Console)就可以输入document.getElementsByTagName('iframe').length这句代码,即可打印出iframe的长度(也就是个数),然后按照从0开始数起。

    (3)当iframe上的操作完后,想重新回到主页面上操作元素,这时候,就可以用switch_to_default_content()方法返回到主页面。

    如下代码:

     iframe = driver.find_element_by_tag_name("iframe")

    driver.switch_to_frame(iframe)

    switch_to_default_content()

    (4)如何判断元素是否在iframe上?

    1.定位到元素后,切换到firepath界面。
    2.看firebug工具左上角,如果显示Top Window说明没有iframe。
    3.如果显示iframe#xxx这样的,说明在iframe上,#后面就是它的id。

    四.selenium用javascript定位

    除了id是定位到的是单个element元素对象,其它的都是elements返回的是list对象
    1.通过id获取
    document.getElementById(“id”)

    2.通过name获取

    document.getElementsByName(“Name”)

    返回的是list
    3.通过标签名选取元素
    document.getElementsByTagName(“tag”)
    4.通过CLASS类选取元素
    document.getElementsByClassName(“class”)
    兼容性:IE8及其以下版本的浏览器未实现getElementsByClassName方法
    5.通过CSS选择器选取元素
    document.querySelectorAll(“css selector")
    兼容性:IE8及其以下版本的浏览器只支持CSS2标准的选择器语法

     js = 'document.getElementById("helloId").click();'

    driver.execute_script(js)

    js1 = 'document.getElementsByClassName("helloName")[0].value = "王大明";'   //整个HTML文档里第一个使用CSS样式类的class="helloName"属性,它的value属性的值设置为“王大明”

    driver.execute_script(js1)

    JQuery是2006年1月诞生的一个基于封装JavaScript的框架,你经常看到的美元符号带上一个圆括号$('XXX'),其实就是document.getElementBy什么什么的这个js方法,至于XXX前面带.的话,就是document.getElementByClass,带#的话,就是document.getElementById

    6.xpath的语法使用基础

    Xpath的使用方法:

     例子 1:html/body/div[1]/div[2] (如果不熟悉html的朋友们,需要自行百度html。)

      该xpath 表示 : 在 html标签下 -> body标签下 -> 第一个div标签下 -> 第二个div标签

      很好理解,继续

     例子 2:.//*[@id='content']/div[2]/ul

       这样会有人不理解了 .//*[@id='content'] 到底是什么意思呢?

        . 代表当前路径

        a//b 表示:在a标签下的子孙辈b标签

        * 可以是任何标签

        [@id='content'] 表示是 id 为 content

      所以:这个例子的意思是: id 为 content 的任何子标签下面 -> 第二个 div标签下 -> ul 标签

      

    Xpath基础学习完毕,接下来开始进阶学习

      //p[text()='a']  :文本为 a 的p标签

      //p[text()='a']  : 文本包含 a 的p标签

      //a[@class='abc']   :class 为 a的 p标签 (当然咯。既然可以为 @class 就一定能用 @id ,为什么不联想下 @src 和@href呢?)

      //p[not(@class='a')]   :class 不为 a的 p标签

    好了,进阶完毕,如果要使用更高阶的Xpath要先属性以上内容,然后联合 Selenium使用

    Xpath和其他定位方式的比较:(主要是和CSS定位的对比)

      Xpath的最大好处是能向上查找,不过缺点是速度过慢。

    css定位介绍

    CSS定位速度快,功能多,但是不能向上查找,比xpath好用,执行效率比xpath来的快,曾经做过两种定位比较的测速,是本人认为最好用的定位方式。
     
    大致用法总结:
    1、*:checked  选中*的checked元素
    2、 li.refined.list.group.item (如果class中间有空格,可以.+.+.全写也可以只写任意一个)
        .checkbox[type^='check'][onclick*='Bebe'][checked$='ed'] +a
        (开头^=   包含*=   结尾$= )+a 是选中同级的后面的a
    3、 li a        :选中 li 标签的后代 a
    5、 li>a       :选中 li 标签的子元素 a
    4、 li,a        :选中 li 和 a
    5、 li +a      :选中 li 同级的 下一个 a
    6、 li ~a       :选中 li 同级的 下面所有的 a
    7、 li>a:last-child  /  li>a:last-of-type  : 选中 li 下最后面一个 a
    8、 li:not([class*='_'])    : li 中的 calss 不含 '_' 
          li:not(:nth-of-type(1))    : 不含第一个 li 的所有 li
    9、 li>a:nth-child(n)   /  li>a:nth-of-type(n) :选中 li 下第 n 个 a
          li>a:nth-last-child(n)   /  li>a:nth-last-of-type(n):选中 li 下,倒数第 n 个 a
        如果 n = odd 表示奇数
        如果 n = even 表示偶数
        div h2:nth-child(n) : 当div的第n个子元素是h2的时候
        div h2:nth-of-type(n):   div下第n个h2子元素
    10、 div[style]     : div中包含 属性style 
    11、 li>a:only-child      :li 下只有1个a的 a 标签
  • 相关阅读:
    deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
    deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
    deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
    deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
    deeplearning.ai 改善深层神经网络 week2 优化算法
    deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
    cs231n spring 2017 lecture8 Deep Learning Networks
    cs231n spring 2017 lecture7 Training Neural Networks II
    cs231n spring 2017 lecture6 Training Neural Networks I
    cs231n spring 2017 Python/Numpy基础
  • 原文地址:https://www.cnblogs.com/xuzhongtao/p/8528419.html
Copyright © 2011-2022 走看看