zoukankan      html  css  js  c++  java
  • xpath和非xpath定位

    xpath和非xpath定位

    xpath,描述页面元素位置信息的路径

    非xpath定位:

    1.By.id,根据元素的id来获取元素

    2.By.name,根据元素的name属性来获取元素,可以是集合

    3.By.tagName,根据元素的标签名来获取元素,可以是集合

    4.By.className,根据元素的样式来获取元素,可以是集合

    5.By.cssSelector,根据元素的css选择器来获取元素,可以是集合

     例如:By.cssSelector("input")等同于By.tagName("input"),标签

    By.cssSelector(".classNameValue")等同于By.className("classNameValue"),.className

    By.cssSelector("#idValue")或者By.cssSelector("input#idValue")等同于By.id("idValue"),#id

    By.cssSelector("input[id='idValue']") ,[属性=’属性值‘] 

    6.By.linkText,根据元素的超链接的文本值来获取元素

    7.By.partialLinkText,根据元素的超链接的部分文本值来获取元素

    xpath定位:

    1..By.xpath("//*[@属性=’属性值‘]") ,后面可接相对路径,可加索引获取唯一元素定位

    例如://*[@id='idValue '] ,

    //*[@class='classValue'] ,

    2./html/body/main/div[1]/header/div[1]/div[1]/div[2]/a/img,绝对路径

    做web测试时,心得

    1.一般用xpath相对路径,可以获取元素唯一定位。

    //*[@class='header-mobile csa']/div/div[2]/div[3]/a/img

    2.对页面元素进行点击等操作时,确保页面元素加载完全,可以加延时等待获取元素,保证点击事件可以正常执行。

     wait.until(new ExpectedCondition<WebElement>() 

    3.点击元素后有页面切换的操作时,可以先把元素滑动到页面可见视线中,在进行点击操作。

    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);

    一段时间后,体会
    1.使用css定位和xpath轴定位,对于页面元素html结构经常变化的网站来说,定位相对稳定很多,不需要去过多调整元素定位,最后要求使用时不操过3级结构取得元素定位
    2.使用@FindBy写pages元素,对于每个页面的元素采用从上到下去罗列整理,当元素变动或者操作改变时,可以只用调试当前页面的操作代码,方便管理和维护元素定位
    3.写css定位时,相同层级元素,前面的父级节点尽量一致,并且找准页面节点
    目前用到的定位写法
    css = ".classNameValue"
    css = "#idValue"
    css = ".classNameValue #idValue"
    css = ".classNameValue input"
    css = ".classNameValue input"
    css = ".classNameValue a.classNameValue"
    css = ".classNameValue>.classNameValue:nth-child(1) input"
    css = ".classNameValue .classNameValue img:last-child"
    css = ".classNameValue [属性="属性值"]"
    css=String.format("标签[属性="%s"] .classNameValue span:nth-child(1)", text)
    xpath = "//标签[@id="idValue"]//span[text()="textValue"]"
    xpath = "//标签[contains(text(),"¥")]"
    xpath = "//input[@type='submit'][@name='fuck']"
    xpath = "//input[@type='submit' and @name='fuck']"
    xpath = "//input[@type='submit' or @name='fuck']"
    xpath ="//input[start-with(@id,'fuck')]"//匹配id以fuck开头的元素,id='fuckyou'
    xpath ="//input[ends-with(@id,'fuck')]"//匹配id以fuck结尾的元素,id='youfuck' 
    xpath ="//input[contains(@id,'fuck')]"//匹配id中含有fuck的元素,id='youfuckyou'
    xpath ="//input[@*='fuck']"//匹配所有input元素中含有属性的值为fuck的元素
    List<String> list =WebElement集合.stream().map(element -> readText(element)).collect(Collectors.toList())

    轴定位
    1.xpath= "//form[@id='form']/descendant::input[@id='su']" descendant表示取当前节点的所有后代元素
    2.xpath= "//span[@id='s_kw_wrap']/following::input[@id='su']"following表示选取当前节点结束标签之后的所有节点
    3.//a[text()='Learn SQL']/parent::li/following-sibling::li/child::a[text()='Learn Python']
    也可以这样写//a[text()='Learn SQL']/parent::li/following-sibling::li[3]/a

    parent::可指定要查找的当前节点的直接父节点,例如,父节点是个div,即可写成parent::div,如果要找的元素不是直接父元素,则不可使用parent,可使用ancestor,代表父辈、祖父辈等节点;

    child::表示直接子节点元素

    following-sibling只会标识出当前节点结束标签之后的兄弟节点,而不包含其他子节点


    4.//和//的区别 //是指从全文上下文中搜索//后面的节点,而.//则是指从前面的节点的子节点中进行查找
    1.starts-with 顾名思义,匹配一个属性开始位置的关键字  -- 模糊定位 //a[starts-with(@name,'tj_lo')]
    2.contains 匹配一个属性值中包含的字符串  -- 模糊定位 //input[contains(@class,'bg s_btn')]
    3.text()  函数文本定位 //a[text()='百度搜索']   //a[contains(text(),"搜索")]
    4.last()  函数位置定位 /A/B/C[last()]   表示A元素→B元素→C元素的最后一个子元素

    5.分隔用空格或者>,区别为空格是所有后代,>是子节点,不包含孙子节点;
    node1 node2 #node1的后代节点node2,node2可以是子节点也可以是孙节点
    node1>node2 #node1的子节点node2
    node1,node2 #取node1和node2的并集
    node1+node2 #找的是node2,条件是同胞节点是node1,也就是node1和node2平级,node1后面是node2

    轴标签参考地址:https://www.cnblogs.com/hanmk/p/9015502.html
    https://blog.csdn.net/qingchunjun/article/details/54772940
    xpath定位参考地址:
    https://www.cnblogs.com/unknows/p/7684331.html
     
  • 相关阅读:
    写爬虫,怎么可以不会正则呢?
    从 Scrapy 学习模块导入技巧
    博客已搬家至CSDN
    更改JDK默认编码,解决DBeaver乱码问题
    【2020面试】- Java中常见集合的默认大小以及扩容机制
    【2020面试】- CAS机制与自旋锁
    【2020面试】- filter和interceptor的区别
    【20k中级开发】-面试题201117
    【开发笔记】
    RPC 调用和 HTTP 调用的区别
  • 原文地址:https://www.cnblogs.com/AIME/p/11204680.html
Copyright © 2011-2022 走看看