• selenium之定位详篇


    一、Web定位方法

      注:(find_elements返回元素list),定位优先级:id,name,classname,css,xpath.

    1、id:
      find_element_by_id()  # find_element_by_id("id")
      find_elements_by_id()
    2、name:
      find_element_by_name() #find_element_by_name(“name”)
      find_elements_by_name()
    3、classname:
      find_element_by_class_name() # find_element_by_class_name("classname")
      find_elements_by_class_name()
    4、tagname:
      find_element_by_tag_name() # find_element_by_tag_name("tagname")
      find_elements_by_tag_name()

    5、linktext:  HTML中<a></a>标签代表的是链接
      find_element_by_link_text() # find_element_by_link_text(“text”)
      find_elements_by_link_text()
      find_element_by_partial_link_text() # find_element_by_partial_link_text(“partialtext”) #
      find_elements_by_partial_link_text()

    6、Xpath:XML path
      find_element_by_xpath()
      find_elements_by_xpath()
    PS:①一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。

      ②绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。

       当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点下的符合的子节点,

       当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级。

      ③下面是相对路径的引用写法:

        查找name属性为username的所有元素//*[@name='username']

        查找所有input标签中含有type属性的元素//input[@type]

        查找所有input标签中任意属性为‘china’的元素//input[@*='china']

        查找页面上所有的input元素://input

        查找页面上第一个form元素://form[1]

        查找页面上第一个form元素内的下一级input元素(即只包括form元素的下一级的第一个input元素,使用绝对路径表示)://form[1]/input

        查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input 

        查找页面上id属性为kw的form元素://form[@id='kw']

        查找页面上name属性为username的input元素://input[@name='username']

        查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]

        查找页面name属性为continue并且type属性为button的input元素://input[@name='continue'][@type='button']  或 //input[@name='continue' and @type='button']  

                  (或写法:/input[@name='continue' or @type='button'])

        查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]

        //*[@id='J_login_form']/dl/dt/input[@id='J_password']
        //*[@id='J_login_form']/*/*/input[@id='J_password']

       ④contains

        //a[contains(@name, ‘name’)]  查找所有a标签下name属性包含‘name’字符串的元素

       ⑤starts-with和ends-with

        //a[starts-with(@name, ‘user’)])查看所有a标签下name属性以‘user’开头的元素

       ⑥ Text

        //*[text()=’退出’] 查找页面文本为退出的元素

        //a[contains(text(), ’退出’)]  查找文本包含‘退出’的元素(这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用



    7、CSS:通过id,name,标签,其他属性定位
      find_element_by_css_selector()
      PS1:#号表示ID,.号表示class

        find_element_by_css_selector(‘input’)

        find_element_by_css_selector(’#kw’)

          find_element_by_css_selector(’.s_ipt’)
          find_element_by_css_selector(’[name=‘wd’]’)
          find_element_by_css_selector(“input#kw”)
          find_element_by_css_selector(“input.s_ipt”)
          find_element_by_css_selector(“input[name=‘wd’]”)
          find_element_by_css_selector(“input[name]”)
          find_element_by_css_selector("[name=‘wd’][autocomplete=‘off’]")

          find_element_by_css_selector(“input[class~=‘btn’]”) #属性值由多个空格隔开,匹配其中一个值的方法  ;例:class=btn left-btn,right-btn

          find_element_by_css_selector('.nav_btn.nav_fff')  #<a class="nav_btn nav_fff" herf="....">登录</a>

     


        
    匹配id属性是以”id_prefix_”开头的元素:a[id^='id_prefix_']
        匹配id属性是以”_id_sufix”结尾的元素:a[id$='_id_sufix']
        匹配id属性中包含”id_pattern”字符的元素:a[id*='id_pattern'] 

      PS2:nth-child(n)  #第n个孩子

        #u_sp > a:nth-child(1) #其中a也可替换为用#id或者.name等表示; 

    三、JS定位 

      id定位:document.getElementById()
      name定位:document.getElementsByName()
      tag定位:document.getElementsByTagName()
      class定位:document.getElementsByClassName()
      css定位:document.querySelectorAll()
      PS1:只有id是elment其他为elements,

      PS2:先把js语句赋值给变量,然后调用execute_script执行    

        button_js="document.getElementById('su').click();"

        driver.execute_script(button_js)

        sendkeys_js="document.getElementsByName('duan')[0].value='laoduan';"

      driver.execute_script(sendkeys_js)

    PS3:JS  document.querySelector()和document.querySelectorAll()

        ①querySelector()只返回匹配的第一个元素,如果没有匹配项,返回null

        ②querySelectorAll()返回匹配的元素集合,如果没有匹配项,返回空的nodelist(节点数组)

        ③这两个方法都可以接受三种类型的参数:id(#),class(.),标签,很像jquery的选择器。

        ④两者都可以有1到多个参数

        ⑤ var obj = document.querySelector("#id");

            var obj = document.querySelector(".classname");
            var obj = document.querySelector("div");
            var el = document.body.querySelector("input[value]");
            var elements = document.querySelectorAll("#score>tbody>tr>td");
            var elements = document.querySelectorAll("#id1, #id2");

    四、jQuery

       基础语法:$(selector).action()    

        search_jq = "$('#kw').val('selenium')"
        button_jq = "$('.s_btn').click()"
        driver.execute_script(search_jq)
        driver.execute_script(button_jq)

       PS:

        id为dv1的那个div, 下面的所有的input标签  #dv1 input (包括字辈和孙辈)

        id为dv1的那个div,下面的子辈的input标签 #dv1 > input (只包括字辈)

    五、APP元素定位 (①基础的定位方法app都有,②elements与下面一样)

    self.dr.find_element_by_accessibility_id()
    self.dr.find_element_by_android_uiautomator()
    self.dr.find_element_by_image()

    self.dr.find_element_by_android_data_matcher()

    self.dr.find_element_by_android_viewtag()

    self.dr.find_element_by_custom()
    self.dr.find_element_by_ios_class_chain()
    self.dr.find_element_by_ios_predicate()
    self.dr.find_element_by_ios_uiautomation()

  • 相关阅读:
    stream流
    python笔记:str.contains小坑之 UserWarning To actually get the groups, use str.extract.
    获取excel的行索引值
    Pandas学习(4、数据载入、存储及文件格式
    python中如何压缩和解压缩文件
    保持服务器屏幕可控制状态
    python判断文件和文件夹是否存在、创建文件夹
    PDF处理
    selenium+python配置chrome浏览器的选项
    python实现复制粘贴
  • 原文地址:https://www.cnblogs.com/Inbreeze/p/11685388.html
Copyright © 2020-2023  润新知