6.2 Selenium定位元素

    技术2022-07-10  144

    在使用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://www.baidu.com/&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(); } }
    Processed: 0.014, SQL: 9