Selenium - 定位器
在 Selenium WebDriver 中定位元素是借助 WebDriver 和 WebElement 类提供的 findElement() 和 findElements() 方法来执行的。
findElement() 根据指定的搜索条件返回 WebElement 对象,如果找不到任何与搜索条件匹配的元素,则最终抛出异常。
findElements() 返回与搜索条件匹配的 WebElements 列表。如果没有找到元素,则返回一个空列表。
下表列出了在 Selenium WebDriver 中定位元素的所有 Java 语法。
方法 | 句法 | 描述 |
---|---|---|
通过ID | driver.findElement(By.id (<元素 ID>)) | 使用 ID 属性定位元素 |
按名字 | driver.findElement(By.name (<元素名称>)) | 使用 Name 属性定位元素 |
按类名 | driver.findElement(By.className (<元素类>)) | 使用 Class 属性定位元素 |
按标签名称 | driver.findElement(By.tagName (<htmltagname>)) | 使用 HTML 标签定位元素 |
通过链接文本 | driver.findElement(By.linkText (<linktext>)) | 使用链接文本定位链接 |
通过部分链接文本 | driver.findElement(By.partialLinkText (<linktext>)) | 使用链接的部分文本定位链接 |
通过CSS | driver.findElement(By.cssSelector (<css 选择器>)) | 使用 CSS 选择器定位元素 |
通过 XPath | driver.findElement(By.xpath (<xpath>)) | 使用 XPath 查询定位元素 |
定位器的使用
现在让我们借助https://www.calculator.net了解每种定位器方法的实际用法
通过ID
这里借助 ID 来访问对象。在本例中,它是文本框的 ID。使用 sendkeys 方法在 ID(cdensent) 的帮助下将值输入到文本框中。
driver.findElement(By.id("cdensity")).sendKeys("10");
按名字
这里借助名称来访问对象。在本例中,它是文本框的名称。使用 sendkeys 方法在 ID(cdensent) 的帮助下将值输入到文本框中。
driver.findElement(By.name("cdensity")).sendKeys("10");
按类别名称
这里借助类名来访问对象。在本例中,它是 WebElement 的类名称。可以借助 gettext 方法访问该值。
List<WebElement> byclass = driver.findElements(By.className("smalltext smtb"));
按标签名称
元素的 DOM 标签名称可用于在 WebDriver 中定位该特定元素。借助这种方法,处理表格非常容易。看看下面的代码。
WebElement table = driver.findElement(By.id("calctable")); List<WebElement> row = table.findElements(By.tagName("tr")); int rowcount = row.size();
通过链接文本
此方法有助于定位具有匹配可见文本的链接元素。
driver.findElements(By.linkText("Volume")).click();
通过部分链接文本
此方法有助于定位具有部分匹配可见文本的链接元素。
driver.findElement(By.partialLinkText("音量")).click();
通过CSS
CSS 被用作识别 Web 对象的方法,但并非所有浏览器都支持 CSS 识别。
WebElement loginButton = driver.findElement(By.cssSelector("input.login"));
通过 XPath
XPath 代表 XML 路径语言。它是一种用于从 XML 文档中选择节点的查询语言。XPath 基于 XML 文档的树表示,并提供通过使用各种标准选择节点来在树中导航的能力。
driver.findElement(By.xpath(".//*[@id = 'content']/table[1]/tbody/tr/td/table/tbody/tr[2]/td[1]/input")).sendkeys("100");