假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。
<html> <head> <body link="#0000cc"> <a href="http://www.likecs.com/" onmousedown="return c({'fm':'tab','tab':'logo'})"> <form action="/s"> <span>按钮</span> <input value="" maxlength="255" autocomplete="off">我们的目的是要定位input标签的输入框。
通过id定位:
driver.findElement(By.id("kw"))通过name定位:
driver.findElement(By.name("wd"))通过class name定位:
driver.findElement(By.className("s_ipt"))通过tag name定位:
driver.findElement(By.tagName("input"))通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
driver.findElement(By.xpath("//*[@id='kw']")) // id定位 driver.findElement(By.xpath("//*[@name='wd']")) // 属性值定位 driver.findElement(By.xpath("//span[text()='按钮']")) // 文本定位 driver.findElement(By.xpath("//input[@class='s_ipt']")) // class属性定位 driver.findElement(By.xpath("/html/body/form/span/input")) // 绝对路径定位 driver.findElement(By.xpath("//span[@class='soutu-btn']/input")) // 相对路径定位 driver.findElement(By.xpath("//form[@id='form']/span/input")) driver.findElement(By.xpath("//input[@id='kw' and @name='wd']")) // 多组合属性定位 driver.findElement(By.xpath("//span[contains(text(),'按钮')]")) // 是否包含文本通过css定位,css定位有N种写法,这里列几个常用写法:
driver.findElement(By.cssSelector("#kw") // id定位 driver.findElement(By.cssSelector("[name=wd]") // name属性值定位 driver.findElement(By.cssSelector(".s_ipt") // class地位 driver.findElement(By.cssSelector("html > body > form > span > input") // css层级定位 driver.findElement(By.cssSelector("span.soutu-btn> input#kw") driver.findElement(By.cssSelector("form#form > span > input")接下来,我们的页面上有一组文本链接。
<a href="http://news.baidu.com">新闻</a> <a href="http://www.hao123.com">hao123</a>通过linkText定位:
driver.findElement(By.linkText("新闻") driver.findElement(By.linkText("hao123")通过 partialLinkText 定位:
driver.findElement(By.partialLinkText("新") driver.findElement(By.partialLinkText("hao") driver.findElement(By.partialLinkText("123") 4.3.xpath进阶-轴定位parent::div 上层父节点,你那叫div的亲生爸爸,最多有一个;
child::div 下层所有子节点,你的所有亲儿子中叫div的;
ancestor::div 上面所有直系节点,是你亲生爸爸或者你亲爹或者你亲爹的爸爸中叫div的;
descendant::div 下面所有节点,你的后代中叫div的,不包括你弟弟的后代;
following::div 自你以下页面中所有节点叫div的;
following-sibling::div 同层下节点,你所有的亲弟弟中叫div的;
preceding::div 同层上节点,你所有的亲哥哥以及他们的后代中叫div的;
preceding-sibling::div 同层上节点,你所有的亲哥哥中叫div的;
详细操作可参考:https://www.cnblogs.com/wangyi0419/p/11638652.html
关于 xpaht 和 css 的定位比较复杂,请参考: xpath语法、 css选择器
第五章 Selenium API 5.1.WebDriver 常用 APIWebDriver 提供了一系列的 API 来和浏览器进行交互,如下:
方法 描述get(String url) 访问目标 url 地址,打开网页
getCurrentUrl() 获取当前页面 url 地址
getTitle() 获取页面标题
getPageSource() 获取页面源代码
close() 关闭浏览器当前打开的窗口
quit() 关闭浏览器所有的窗口
findElement(by) 查找单个元素
findElements(by) 查到元素列表,返回一个集合
getWindowHandle() 获取当前窗口句柄
getWindowHandles() 获取所有窗口的句柄
5.2.WebElement 常用 API
通过 WebElement 实现与网站页面上元素的交互,这些元素包含文本框、文本域、按钮、单选框、div等,WebElement提供了一系列的方法对这些元素进行操作:
方法 描述click() 对元素进行点击
clear() 清空内容(如文本框内容)
sendKeys(...) 写入内容与模拟按键操作
isDisplayed() 元素是否可见(true:可见,false:不可见)
isEnabled() 元素是否启用
isSelected() 元素是否已选择
getTagName() 获取元素标签名
getAttribute(attributeName) 获取元素对应的属性值
getText() 获取元素文本值(元素可见状态下才能获取到)
submit() 表单提交
5.2.1.代码示例 public class BaiduSearch { public static void main(String[] args) { // 1.创建webdriver驱动 WebDriver driver = new ChromeDriver(); // 2.打开百度首页 driver.get("https://www.baidu.com"); // 获取搜索框元素 WebElement inputElem = driver.findElement(By.id("kw")); // clear()方法,清空输入框内容 inputElem.clear(); // sendKeys()方法,在搜索框中输入搜索内容 inputElem.sendKeys("selenium"); // 元素是否显示 boolean displayed = inputElem.isDisplayed(); System.out.println(displayed); // 输出true // 元素是否启用 boolean enabled = inputElem.isEnabled(); System.out.println(enabled); // 输出true // 判断元素是否被选中状态,一般用在Radio(单选),Checkbox(多选),Select(下拉选) // 在输入框中使用无意义 boolean selected = inputElem.isSelected(); System.out.println(selected); // 输出fasle // 获取标签名 String tagName = inputElem.getTagName(); System.out.println(tagName); // 输出input // 获取属性名(name属性) String name = inputElem.getAttribute("name"); System.out.println(name); // 输出wd // 获取文本值 String text = inputElem.getText(); System.out.println(text); // 输出selenium // 通过submit提交 driver.findElement(By.id("su")).submit(); // click()方法,点击百度一下按钮 driver.findElement(By.id("su")).click(); // 退出浏览器 driver.quit(); } } 第六章 元素等待机制