5

超全selenium元素定位XPath、CSS - 强哥不强

 1 year ago
source link: https://www.cnblogs.com/roronoazoro77/p/16559607.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

说明:在HTML页面中,<p> 是一个标签,<p>hello</p> 是一个元素,元素由一个开始的标签和结束的标签组成。<font color="red">标签包含属性名color,属性值为red。

说明:CSS的id选择器,id常用于JS操作DOM节点对象。当同个id被多次引用时,通过getElementById方法获取到的是在文档中第一个出现该id的标签(DOM节点对象),因此id一般只被引用于一个标签。

<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">
input = find_element_by_id("su")

class定位

说明:CSS的.class选择器,用于包装一组样式和布局供标签引用,常被复用于多个标签,且多个class可同时作用于同一个标签(多个class通过空格隔开,如:class="btn self-btn bg s_btn")。

  1. 单个clsss示例:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
input = find_element_by_class("s_ipt")
  1. 多个class定位示例:
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">

定位:当标签被多个class作用时,此时不推荐使用class定位,因为通常会定位到多个元素,可通过XPath定位和CSS定位代替。

注意:class定位只能使用一个class,而XPath定位和CSS定位则需要输入所有class

# class定位
input_1 = find_element_by_class("btn")
input_2 = find_element_by_class("self-btn")
input_3 = find_element_by_class("bg s_btn")
# XPath定位
input_4 = find_element_by_Xpath('//input[@class="btn self-btn bg s_btn"]')
# CSS定位
input_5 = find_element_by_css('input[class="btn self-btn bg s_btn"]')

name定位

说明:HTML标签中name属性相当于一个变量名,value属性相当于一个变量值,在JS中以及向网站后端传送参数时,与value一起用,比如name是“color”,value是“red”,那么就会有参数color=“red”

<input id="kw" name="wd" class="s_ipt" value="输入框的内容" maxlength="255" autocomplete="off">
input = find_element_by_name("wd")

tag定位

说明:根据标签名称定位,常被用来定位一类功能,HTML页面中有很多相同的标签,因此很少用tag定位单个元素。

<iframe src="https://www.google.com/recaptcha/api2/aframe" width="0" height="0" style="display: none;">
iframe = find_element_by_tag_name("iframe")

link_text定位

说明:专门定位文本链接元素,通过<a>标签对之间的文字信息来定位元素。

<a  href="http://news.baidu.com">新闻</a>
driver.find_element_by_link_text("新闻")

partial_link_text定位

说明:partial_link_text定位是对link_text定位的一种补充,有些文字链接比较长,这个时候我们可以取文字链接的部分文字进行定位,只要这部分文字可以唯一地标识这个链接即可。

<a class="mnav" name="tj_lang" href="#">一个很长的文本链接</a>
driver.find_element_by_partial_link_text("文本链接")

XPath定位

说明:XPath 是用于在 XML 文档中定位节点的语言。由于 HTML 可以是 XML (XHTML) 的实现,因此 Selenium 用户可以利用这种强大的语言来定位其 Web 页面中的元素。

XPath定位方法:

  1. # 定位该路径的input元素
    driver.find_element_by_xpath("html/body/div/form/input")
    
  2. # 定位form元素下的input元素
    driver.find_element_by_xpath("//form/input")
    
  3. # 定位form元素下第一个input元素
    driver.find_element_by_xpath("//form/input[1]")  # 索引从[1]开始
    
  4. # 定位包含value属性的input元素
    driver.find_element_by_xpath("//input[@value]")  # 属性前必须带@
    
  5. 属性+属性值

    # 定位包含value属性值为‘xxx’的input元素
    driver.find_element_by_xpath("//input[@value='xxx']")
    # 注意:使用class属性定位时,需写入该元素所有class值才能定位到
    driver.find_element_by_xpath("//input[@class='a b c']")  # 多个class值通过空格隔开分别为a,b,c
    
  6. *号(任意值)

    # 定位包含value属性的任意元素
    driver.find_element_by_xpath("//*[@value]")
    # 定位包含任意属性的值等于'xxx'的input元素
    driver.find_element_by_xpath("//input[@*='xxx']")
    
  7. 层级与属性结合

    # 定位包含id属性值为'xxx'的from元素下的input元素
    driver.find_element_by_xpath("//from[@id='xxx']/input")
    # 跨级定位
    driver.find_element_by_xpath("//from[@id='xxx']/*/input")  # 跨一级
    driver.find_element_by_xpath("//from[@id='xxx']/*/*/input")  # 跨两级
    driver.find_element_by_xpath("//from[@id='xxx']//input")  # 跨多级
    
  8. 轴方式定位

    轴表达式说明:

    parent::* :表示当前节点的父节点元素,同: //div/..
    
    ancestor::* :表示当前节点的祖先节点元素
    
    descendant::* : 表示当前节点的子孙节点元素
    
    child::* :表示当前节点的子元素//A/descendant::* 表示A的所有后代元素,同://A/*
    
    self::* :表示当前节点的自身元素
    
    ancestor-or-self::* :表示当前节点的及它的祖先节点元素
    
    descendant-or-self::* :表示当前节点的及它们的后代元素
    
    following-sibling::* :表示当前节点的后序所有兄弟节点元素
    
    preceding-sibling::* :表示当前节点的前面所有兄弟节点元素
    
    following::* :表示html结构中当前节点的之前所有层级元素
    
    preceding::* :表示html结构中当前节点的之后所有层级元素
    
    
    # 定位父级元素
    driver.find_element_by_xpath('//*[@class="值"]/parent::*')
    driver.find_element_by_xpath('//*[@class="值"]/..')
    # 定位指定的祖先元素
    driver.find_element_by_xpath('//input[@id="su"]//ancestor::div')
    driver.find_element_by_xpath('//input[@id="su"]//ancestor::div[@id="s_fm"]')
    # 定位当前元素之前的所有同级元素
    driver.find_elements_by_xpath('//*[@class="值"]/preceding-sibling::*')
    # 定位当前元素之后的所有同级的input元素
    driver.find_elements_by_xpath('//*[@class="值"]/following-sibling::input')
    # 定位同级元素的上n个元素(n从1开始)
    driver.find_element_by_xpath('//*[@class="值"]/preceding-sibling::*[n]')
    # 定位同级元素的下n个元素(n从1开始)
    driver.find_element_by_xpath('//*[@class="值"]/following-sibling::*[n]')
    
  9. text()标签对文本方法

    <button>登录</button>
    

    注意:“ text() ”可通过“ . ”表示!

    # 定位标签对文本等于‘登录’的button元素,注意非属性不需要@
    driver.find_element_by_xpath('//button[text()="登录"]')
    # 用“ . ”代替text()
    driver.find_element_by_xpath('//button[.="登录"]')
    
  10. 模糊属性值匹配方法

    <button id="a_b_c">请点击登录</button>
    
    • starts-with(@属性/text(),开头值):

      driver.find_element_by_xpath('//button[starts-with(@id,"a")]')
      driver.find_element_by_xpath('//button[starts-with(text(),"请")]')
      
    • ends-with(@属性/text(),结尾值):

      driver.find_element_by_xpath('//button[ends-with(@id,"c")]')
      driver.find_element_by_xpath('//button[ends-with(text(),"登录")]')
      
    • contains(@属性/text(),包含值):

      driver.find_element_by_xpath('//button[contains(@id,"b")]')
      driver.find_element_by_xpath('//button[contains(text(),"点击")]')
      
  11. and、or、not

    <input id="su" value="abc">百度一下</input>
    
    # 定位包含id属性值为“su"和value属性值为“abc”的input元素
    driver.find_element_by_xpath('//input[@id="su" and @value="abc"]')
    
    # 定位包含id属性值为“su"或“kw”的input元素
    driver.find_element_by_xpath('//input[@id="su" or @id="kw"]')
    
    # 定位不包含id属性值为“kw”的input元素
    driver.find_element_by_xpath('//input[not(@id="kw")]')
    
  12. last()方法

    # 定位搜索到的最后一个元素
    driver.find_element_by_xpath('//ul/li[last()]')
    # 定位搜索到的倒数第二个元素
    driver.find_element_by_xpath('//ul/li[last()-1]')
    
  13. 计算符方式定位

    <body>
      <p>1</p>
      <p>2</p>
      <p>3</p>
      <p>4</p>
    </body>
    
    # 定位标签文本等于1的p元素
    driver.find_element_by_xpath('//body/p[.=1]')
    # 定位标签文本不等于2的p元素
    driver.find_element_by_xpath('//body/p[.!=2]')
    # 定位标签文本大于3的p元素
    driver.find_element_by_xpath('//body/p[.>3]')
    # 定位标签文本小于等于3的p元素
    driver.find_element_by_xpath('//body/p[.<=4]')
    
  14. position()方法定位
    示例:

    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    
    # 定位第一个li元素
    driver.find_element_by_xpath('//ul/li[position()=1')
    # 定位第三个li元素
    driver.find_element_by_xpath('//ul/li[position()=3')
    
  15. 根据子元素定位父元素
    示例:

    <ul>
      <li id="test">1</li>
    </ul>
    
    # 定位子元素含有li元素的ul元素
    driver.find_element_by_xpath('//ul[li]')
    # 定位子元素含有li元素且li元素id属性值为test的所有元素
    driver.find_element_by_xpath('//*[li[@id="test"]]')
    # 定位子孙元素含有li元素且li元素id属性值为test的所有元素
    driver.find_element_by_xpath('//*[.//*[@id="test"]]')
    

CSS定位

说明:CSS指层叠样式表(Cascading Style Sheet),用来定义如何显示HTML和XML的元素。CSS使用选择器为页面元素绑定属性。

CSS定位方法:

  1. .class选择器

    <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
    
    # 点号(.)加class属性值
    driver.find_element_by_css_selector(".s_ipt")
    

    扩展示例:

    <span class="btn_wr s_btn_wr bg" id="s_btn_wr">
        <input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn"></span>
    
    # .btn_wr.s_btn_wr:定位class属性中同时有btn_wr和s_btn_wr的元素
    driver.find_element_by_css_selector(".btn_wr.s_btn_wr")
    # .btn_wr .btn:定位class属性为tn_wr元素的后代包含class属性为btn的所有元素
    driver.find_element_by_css_selector(".btn_wr .btn")
    
  2. #id选择器

    <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
    
    # 井号(#)表示通过id属性值来定位
    driver.find_element_by_css_selector("#kw")
    # 定位class属性值包含form的元素的子孙元素且子孙元素id属性值为kw
    driver.find_element_by_css_selector(".form #kw")
    
  3. 标签名.class值、标签名#id值

    <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
    
    # 定位class属性值含有s_ipt的input标签元素
    driver.find_element_by_css_selector("input.s_ipt")
    # 定位id属性值为kw的input标签元素
    driver.find_element_by_css_selector("input#kw")
    # 定位class属性值含有s_ipt且id属性值为kw的input标签元素
    driver.find_element_by_css_selector("input.s_ipt#kw")
    
  4. 标签名[属性名=属性值]

    <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
    
    # 定位name属性值为wd的input标签元素
    driver.find_element_by_css_selector('input[name="wd"]')
    # 定位type属性值为text的所有元素
    driver.find_element_by_css_selector('[type="text"]')
    # 定位name属性值为wd的input且type属性值为text的input标签元素
    driver.find_element_by_css_selector("input[name="wd"][type="text"]")
    
  5. 属性模糊值定位

    <input type="text" class="abc ede fgh" name="s_ipt" id="kw" maxlength="100">
    
    # 定位name属性值以s_开头的元素
    driver.find_element_by_css_selector('[name^="s_"]')
    # 定位name属性值包含_ip的元素
    driver.find_element_by_css_selector('[name*="_ip"]')
    # 定位name属性值以ipt结尾的元素
    driver.find_element_by_css_selector("[name$="ipt"]")
    # 定位class属性包含ede纯字母单词的元素,非字母分割
    driver.find_element_by_css_selector("[class~="ede"]")
    # 定位class以abc纯字母单词开头的元素,非字母分割
    driver.find_element_by_css_selector("[class|="ede"]")
    
  6. 层级定位
    示例:

    <div>
      <ul>
        <li>1</li>
        <li>2</li>
      </ul>
    </div>
    
    # 根据路径定位li元素
    driver.find_element_by_css_selector('div>ul>li')
    # 定位div元素下所有li子孙元素
    driver.find_element_by_css_selector('div li')
    # 定位div元素下下层的li元素
    driver.find_element_by_css_selector('div>*>li')
    
  7. 定位同级兄弟元素

    <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
    <li>1</li>
    <li>2</li>
    
    # 定位input元素下一个li兄弟元素
    driver.find_element_by_css_selector('input#kw+li')
    # 定位input元素以后所有li兄弟元素
    driver.find_element_by_css_selector('input#kw~li')
    
  8. 伪类定位元素

    div>:first-child         # 定位div元素下第一个子元素
    
    div>:nth-child(2)        # 定位div元素下第二个子元素
    
    div>:last-child          # 定位div元素下最后个子元素
    
    input:focus              # 定位获取焦点的input元素
    
    input:enabled            # 定位可操作的input元素
    
    input:checked            # 定位处于勾选状态的checkbox元素
    
    input:not([id])          # 定位所有无id属性的input元素
    
  9. 多标签定位

    <input type="text" class="s_ipt" name="wd" id="kw">
    <li id="ts">1</li>
    
    # 同时定位input元素和li元素
    driver.find_element_by_css_selector('input, li')
    driver.find_element_by_css_selector('input[name="wd"], li#ts')
    

    注意:","后面需接空格。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK