在使用Selenium时,往往需要先通过定位器找到响应的元素,然后再进行其他操作。Selenium WebDriver提供多种定位策略,如id定位、name定位、class定位、tag name定位、link text定位、Xpath定位和CSS定位等。下面将分别介绍这些定位策略。
1.id定位
id定位,即通过id在网页中查询元素,使用简单且常用。例如,在百度首页的搜索框输入“医药库”后点击搜索按钮进行搜索。搜索框和搜索按钮元素HTML代码分别如下。
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
<input type="submit" id="su" value="百度一下" class="bg s_btn">
//程序6-3
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement searchBox = driver.findElement(By.id("kw"));
searchBox.sendKeys("医药库");
WebElement searchButton = driver.findElement(By.id("su"));
searchButton.submit();
//为了查看操作效果,注释关闭浏览器的代码
//driver.quit();
}
}
2.name定位
当元素中包含name属性时,可以使用name进行定位。以上述案例为例,通过name定位获取百度输入框元素,然后输入“医药库”进行搜索。
//程序6-4
public class Location {
public static void main(String[] args) throws {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement searchBox = driver.findElement(By.name("wd"));
searchBox.sendKeys("医药库");
WebElement searchButton = driver.findElement(By.id("su"));
searchButton.submit();
//为了查看操作效果,注释关闭浏览器的代码
//driver.quit();
}
}
3.class定位
当元素中包含class属性时,可以使用class进行定位。仍然以上述案例为例,通过class定位获取百度输入框元素,然后输入“医药库”进行搜索。
//程序6-5
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement searchBox = driver.findElement(By.className("s_ipt"));
searchBox.sendKeys("医药库");
WebElement searchButton = driver.findElement(By.id("su"));
searchButton.submit();
//为了查看操作效果,注释关闭浏览器的代码
//driver.quit();
}
}
4.tag name定位
Selenium WebDriver也提供了tag name(标签名称)定位的方法,使用标签名称可以很方便地定位一些元素。通过tagName来搜索元素,会返回多个元素,因此需要使用findElements()。如通过tagName来搜索百度首页中所有input元素,结合type属性,过滤出文本输入框元素。
//程序6-6
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
List<WebElement> buttons = driver.findElements(By.tagName("input"));
for (WebElement webElement : buttons) {
if (webElement.getAttribute("type").equals("text")) {
System.out.println(webElement);
}
}
driver.quit();
}
}
5.link text定位
link text定位,是通过链接文本定位元素的。如通过link text来定位百度首页的登录链接,登录链接元素的HTML代码如下所示。
<a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5" name="tj_login" class="lb" onclick="return false;">登录</a>
//程序6-6
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement login = driver.findElement(By.linkText("登录"));
System.out.println("link text:" + login.getText());
driver.quit();
}
}
如果想用一些关键字匹配的时候,可以使用partialLinkText()这个方法,通过部分超链接文字来定位元素。
//程序6-7
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement login = driver.findElement(By.partialLinkText("登"));
System.out.println("link text:" + login.getText());
driver.quit();
}
}
6.CSS定位
在4.1 Jsoup解析小节中,介绍了CSS选择器,这里不再赘述。Selenium WebDriver在定位元素时,也可以使用CSS选择器。如通过CSS选择器来定位百度首页的登录链接。
//程序6-8
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement login = driver.findElement(By.cssSelector("#u1 > a.lb"));
System.out.println("link text:" + login.getText());
driver.quit();
}
}
7.Xpath定位
在4.2 JsoupXpath解析小节中,介绍了Xpath表达式,这里不再赘述。Selenium WebDriver支持使用Xpath表达式定位元素。如通过Xpath表达式来定位百度首页的登录链接。
//程序6-9
public class Location {
public static void main(String[] args) {
WebDriver driver = WebDriverUtils.getWebDriver();
driver.get("http://www.baidu.com");
WebElement login = driver.findElement(By.xpath("//*[@id=\"u1\"]/a[8]"));
System.out.println("link text:" + login.getText());
driver.quit();
}
}