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