3.java+selenium+maven:元素定位
元素定位原则:定位表达式定位到对应的唯一元素
一、基础元素定位
By.id:根据元素的id属性来定位
By.name:根据元素的name属性来定位
By.tagName:根据元素的标签名来定位,基本不使用
By.className:根据元素的class属性来定位
By.linkText:根据超链接的完整文本值来定位元素
By.partialLinkText:根据超链接的部分文本值来定位
例子:
WebDriver driver = openBrowser("chrome"); driver.get("https://www.baidu.com"); //1.id定位 WebElement id = driver.findElement(By.id("kw")); id.sendKeys("UI自动化"); //2.name定位 driver.findElement(By.name("wd")).sendKeys("UI自动化"); //3.tagName定位(基本不使用) List<WebElement> list = driver.findElements(By.tagName("input")); System.out.println(list.size()); //4.className定位:不支持带空格的复合类名,可以选取其中之一且为唯一的元素值 driver.findElement(By.className("s_ipt")).sendKeys("UI自动化"); //5.linkText定位 driver.findElement(By.linkText("百度首页")).click(); //6.partialLinkText定位 driver.findElement(By.partialLinkText("闻")).click();
二、cssSelector元素定位
根据tagName:By.cssSelector("标签名");
根据id:By.cssSelector("#id");
根据className(样式名):By.cssSelector("标签名.className");
根据元素属性:By.cssSelector("标签名[属性名='属性值']");
单属性:By.cssSelector("标签名[属性名='属性值']");
多属性:By.cssSelector("标签名[属性名1='属性值'][属性名2='属性值']")
例子:
WebDriver driver = openBrowser("chrome"); driver.get("https://www.baidu.com"); //1.tagName List<WebElement> list = driver.findElements(By.cssSelector("input")); System.out.println(list.size()); //2.id driver.findElement(By.cssSelector("#kw")).sendKeys("UI自动化"); //3.className driver.findElement(By.cssSelector(".bg .s_btn")).click(); //4.根据元素属性 driver.findElement(By.cssSelector("a[href='http://news.baidu.com']")).click();
三、xpath元素定位
xpath其实就是一个path(路径),一个描述页面元素位置的路径,相当于元素的坐标;基于XML文档树状结构,是XML路径语言,用来查询xml文档中的节点;既可以用于XML也可以用于HTML
1.绝对定位
从根开始找(根目录),例如百度首页的“新闻”文本定位,/html/body/div[1]/div[2]/div[2]/a[1]
2.相对定位
只要不是/开始的,就是相对路径,例如百度首页的“新闻”文本定位,//*[text()='新闻']
路径解释:
//:匹配指定节点,不考虑它们位置(/则表示绝对路径,从根下开始)
*:通配符,匹配任意元素标签名
@:选取属性
[]:属性判断条件表达式
定位方式:
通过元素名定位://input,获取页面所有input元素
通过元素名+索引定位://input[1],获取页面input标签的第一个位置
使用元素名+属性://input[@name='wd'],获取页面input标签属性name值为wd的元素
使用元素(html元素–>标签)名+包含部分属性值://input[contains(@class,'bg')],获取页面input标签class包含“bg”属性的元素
使用元素名+元素的文本内容://a[text()='新闻'],获取页面a标签文本内容等于“新闻”文本内容的元素
使用元素名+包含元素的部分文本内容://a[contains(text(),'新闻')],获取页面a标签带有“新闻”文本内容的元素
3.轴定位
当某个元素的各个属性及其组合都不足以定位时,可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位
轴名称 | 解释 |
ancestor | 选取当前节点的所有祖先节点(包括父节点),找所有的祖先 |
parent | 选取当前节点之前的所有节点 |
preceding-sibling | 选取当前节点之前的所有兄弟节点 |
following | 选取当前节点之后的所有节点 |
following-sibling | 选取当前节点之后的所有兄弟节点 |
使用语法:/轴名称::节点名称[@属性=值],例如://div/table//td//preceding::td
四、chrome浏览器定位调试
1.js调试方式
console里面执行javascript代码,操作dom对象。每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
通过id获取:document.getElementById(“id”)
通过name获取:document.getElementsByName(“Name”) 返回的是list
通过标签名选取元素:document.getElementsByTagName(“tag”)
通过CLASS类选取元素:document.getElementsByClassName(“class”)
通过CSS选择器选取元素:document.querySelectorAll(“css selector")
2.xpath或css调试
xpath:使用$x("")
css调试:使用$("") 或$$("")