Java使用Selenium常用API介绍

环境安装之Selenium

1.通过jar包安装

点击 Selenium下载 链接 你会看到Selenium Standalone Server的介绍:

The Selenium Server is needed in order to run Remote Selenium WebDriver. Selenium 3.X is no longer capable of running Selenium RC directly, rather it does it through emulation and the WebDriverBackedSelenium interface.

Download version 3.4.0
点击版本号进行下载,下载完成将会得到一个selenium-server-standalone-3.4.0.jar文件。
打开IntelliJ IDEA,导入.jar包。

点击菜单栏 File –> Project Structure(快捷键Ctrl + Alt + Shift + s) ,点击 Project Structure界面左侧 的“Modules” 。在“Dependencies” 标签界面下,点击右边绿色的“+” 号,选择第一个选项“JARs or directories…” ,选择相应的 jar 包,点“OK” ,jar包添加成功。

2.通过Maven安装

关于Maven安装又是另一个话题了。你可以参考其它资料学习在IntelliJ IDEA创建Maven项目。

Maven官网、idea & maven help、Maven仓库

打开pom.xml 配置Selenium。



  
  4.0.0  
  com.mvn.demo  
  MyMvnPro  
  1.0-SNAPSHOT  
   
     
       
        org.apache.maven.plugins  
        maven-compiler-plugin  
         
          1.6  
          1.6 
         
       
     
    
   
      
     
      org.seleniumhq.selenium  
      selenium-java  
      3.4.0 
     
   


虽然,学习Maven需要增加你的学习成本,但如果你需要长期使用Java编程语言,或者想用Java来做更多事情的话,越早使用Maven越好!因为它会让的第三方包管理变得非常简单。

3.Hello Selenium

最后,少不了要写一个简单的Selenium Sample来验证Selenium安装是否成功,打开IntelliJ IDEA 创建一个新类Itest.java

package com.kurisu.learn;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Itest {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.itest.info");
        String title = driver.getTitle();
        System.out.printf(title);
        driver.close();
    }
}

如果执行报错,请看下一节,Selenium3浏览器驱动。

selenium3 浏览器驱动

1.下载浏览器驱动

当selenium升级到3.0之后,对不同的浏览器驱动进行了规范。如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。
各浏览器下载地址:
Firefox浏览器驱动:geckodriver
Chrome浏览器驱动:chromedrivertaobao备用地址
IE浏览器驱动:IEDriverServer
Edge浏览器驱动:MicrosoftWebDriver
Opera浏览器驱动:operadriver
PhantomJS浏览器驱动:phantomjs
注:部分浏览器驱动地址需要科学上网。

2.设置浏览器驱动

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“C:\driver”目录添加到Path的值中。

3.验证浏览器驱动

验证不同的浏览器驱动是否正常使用。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.opera.OperaDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;

public class Itest {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();    //Chrome浏览器
        WebDriver driver = new FirefoxDriver();   //Firefox浏览器
        WebDriver driver = new EdgeDriver();      //Edge浏览器 
        WebDriver driver = new InternetExplorerDriver();  // Internet Explorer浏览器 
        WebDriver driver = new OperaDriver();     //Opera浏览器 
        WebDriver driver = new PhantomJSDriver();   //PhantomJS
    }
}

selenium元素定位

1.selenium定位方法

Selenium提供了8种定位方式。

  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • xpath
  • css selector

这8种定位方式在Java selenium中所对应的方法为:

  • findElement(By.id())
  • findElement(By.name())
  • findElement(By.className())
  • findElement(By.tagName())
  • findElement(By.linkText())
  • findElement(By.partialLinkText())
  • findElement(By.xpath())
  • findElement(By.cssSelector())

2.定位方法的用法

假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。



  
  
    
    
      Title
    
  
  
  
    
    

我们的目的是要定位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=kw的节点
        driver.findElement(By.xpath("//*[@name='wd']")); //获取任意name=wd的节点
        driver.findElement(By.xpath("//input[@class='s_ipt']")); //获取任意calss=s_ipt的节点
        driver.findElement(By.xpath("/html/body/form/span/input")); //获取html->body->form->span->input节点
        driver.findElement(By.xpath("//span[@class='soutu-btn']/input")); //获取任意class='soutu-btn'的span里的input节点
        driver.findElement(By.xpath("//form[@id='form']/span/input")); //获取任意id="form"的表单下span下的input节点
        driver.findElement(By.xpath("//input[@id='kw' and @name='wd']")); //获取任意id="kw"并且name="wd"的input节点
        driver.findElement(By.xpath("//input[stars-with(@id,'ctrl')]")); //获取id以ctrl开头的input节点
        driver.findElement(By.xpath("//input[ends-with(@id,'ctrl')]")); //获取id以ctrl结尾的input节点
        driver.findElement(By.xpath("//input[contains(@id,'ctrl')]")); //获取id包含ctrl的input节点
        driver.findElement(By.xpath("//td[@class='a1']/parent::tr")); //获取任意calss=a1的td节点的父级tr节点
        driver.findElement(By.xpath("//td[@class='a3']/ancestor::div")); //获取任意calss=a3的td节点的所有父辈div节点
        driver.findElement(By.xpath("//td[@class='a3']/ancestor-or-self::div")); //获取任意calss=a3的td节点以及它所有父辈div节点
        driver.findElement(By.xpath("//tr[@class='a4']/descendant::td")); //获取任意calss=a4的tr节点的子td节点
        driver.findElement(By.xpath("//tr[@class='a4']/descendant-or-self::td")); //获取任意calss=a4的tr节点和它的子td节点
        driver.findElement(By.xpath("//tr[@class='a4']/preceding::span")); //获取任意calss=a4的tr节点开始标签之前的所有span节点(不包括自己和自己的子节点)
        driver.findElement(By.xpath("//tr[@class='a4']/preceding-sibling::span")); //获取任意calss=a4的tr节点开始标签之前的所有同级span节点
        driver.findElement(By.xpath("//tr[@class='a4']/following::span")); //获取任意calss=a4的tr节点结束标签之后的所有span节点(不包括自己和自己的子节点)
        driver.findElement(By.xpath("//tr[@class='a4']/following-sibling::span")); //获取任意calss=a4的tr节点和之后的所有同级span节点
    
  • 通过css定位,css定位有N种写法,这里列几个常用写法:

        driver.findElement(By.cssSelector("#kw");
        driver.findElement(By.cssSelector("[name=wd]");
        driver.findElement(By.cssSelector(".s_ipt");
        driver.findElement(By.cssSelector("html > body > form > span > input");
        driver.findElement(By.cssSelector("span.soutu-btn> input#kw");
        driver.findElement(By.cssSelector("form#form > span > input");
    

接下来,我们的页面上有一组文本链接。

   新闻hao123
  • 通过link text定位:

    driver.findElement(By.linkText("新闻");
    driver.findElement(By.linkText("hao123");
    
  • 通过partialLink text定位:

    driver.findElement(By.partialLinkText("新");
    driver.findElement(By.partialLinkText("hao");
    driver.findElement(By.partialLinkText("123");
    

关于xpaht和css的定位比较复杂,请参考: xpath语法、css选择器

控制浏览器操作

1.控制浏览器窗口大小

有时候我们希望能以某种浏览器尺寸找开,访问的页面在这种尺寸下运行。例如可以将浏览器设置成移动端大小(480* 800),然后访问移动站点,对其样式进行评估;WebDriver 提供了 manage().window().setSize()方法来设置浏览器的大小。

  • maximize() 设置浏览器最大化
  • setSize() 设置浏览器宽高
        import org.openqa.selenium.Dimension;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.chrome.ChromeDriver;
        
        public class Browser {
            public static void main(String[] args) throws InterruptedException {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.cn");
                driver.manage().window().maximize();
                Thread.sleep(2000);
                driver.get("https://m.baidu.cn");
                driver.manage().window().setSize(new Dimension(480, 800));
                Thread.sleep(2000);
                driver.quit();
            }
        }

在 PC 端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行, 那么可以使用 maximize()方法使打开的浏览器全屏显示, 其用法与 setSize()相同, 但它不需要任何参数。

2.控制浏览器后退、前进

在使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便地在浏览过的网页之间切换,WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮。下面通过例子来演示这两个方法的使用。

  • back() 模拟浏览器后退按钮
  • forward() 模拟浏览器前进按钮
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.chrome.ChromeDriver;
        import org.openqa.selenium.By;

        public class BrowserGo {
            public static void main(String[] args) throws InterruptedException {
                WebDriver driver = new ChromeDriver();     //get 到百度首页    
                driver.get("https://www.baidu.com/");
                System.out.printf("now accesss %s \n", driver.getCurrentUrl());
                Thread.sleep(2000);     //点击“新闻” 链接    
                driver.findElement(By.linkText("新闻")).click();
                System.out.printf("now accesss %s \n", driver.getCurrentUrl());
                Thread.sleep(2000);     //执行浏览器后退    
                driver.navigate().back();
                System.out.printf("back to %s \n", driver.getCurrentUrl());
                Thread.sleep(2000);     //执行浏览器前面    
                driver.navigate().forward();
                System.out.printf("forward to %s \n", driver.getCurrentUrl());
                Thread.sleep(2000);
                driver.quit();
            }
        }

为了看清脚本的执行过程,下面每操作一步都通过printf()方法来打印当前的URL地址。

3.刷新页面

有时候需要手动刷新(F5) 页面。

  • refresh() 刷新页面(F5)
//刷新页面
driver.navigate().refresh();

WebDriver常用方法

前面我们已经学习了定位元素, 定位只是第一步, 定位之后需要对这个元素进行操作, 或单击(按钮) 或 输入(输入框) , 下面就来认识这些最常用的方法。

1.WebDriver 常用方法

下面先来认识 WebDriver 中最常用的几个方法:

  • clear() 清除文本。
  • sendKeys(*value) 模拟按键输入。
  • click() 单击元素
        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.chrome.ChromeDriver;
        
        public class BaiduDemo {
            public static void main(String[] args) {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.com/");
                WebElement search_text = driver.findElement(By.id("kw"));
                WebElement search_button = driver.findElement(By.id("su"));
                search_text.sendKeys("Java");
                search_text.clear();
                search_text.sendKeys("Selenium");
                search_button.click();
                driver.quit();
            }
        }

clear()方法用于清除文本输入框中的内容。
sendKeys()方法模拟键盘向输入框里输入内容。 但是它的作用不仅于此, 我们还可以用它发送键盘按键, 甚至用它来指定上传的文件。
click()方法可以用来单击一个元素,前提是它是可以被单击的对象,它与 sendKeys()方法是Web页面操作中最常用到的两个方法。 其实click()方法不仅仅用于单击一个按钮,它还可以单击任何可以单击的文字/图片链接、复选框、单选框、下拉框等。

2.其它常用方法

  • submit()

submit()方法用于提交表单。 例如,在搜索框输入关键字之后的“回车” 操作, 就可以通过 submit()方法模拟.

WebElement search_text = driver.findElement(By.id("kw"));
search_text.sendKeys("Selenium");search_text.submit();
  • getSize() 返回元素的尺寸。
  • getText() 获取元素的文本。
  • getAttribute(name) 获得属性值。
  • isDisplayed() 设置该元素是否用户可见。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class BaiduDemo {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com/");     
        //获得百度输入框的尺寸   
        WebElement size = driver.findElement(By.id("kw"));
        System.out.println(size.getSize());    
         //返回百度页面底部备案信息    
        WebElement text = driver.findElement(By.id("cp"));
        System.out.println(text.getText());    
        //返回元素的属性值, 可以是 id、 name、 type 或元素拥有的其它任意属性    
        WebElement ty = driver.findElement(By.id("kw"));
        System.out.println(ty.getAttribute("type"));    
        //返回元素的结果是否可见, 返回结果为 True 或 False    
        WebElement display = driver.findElement(By.id("kw"));
        System.out.println(display.isDisplayed());
        driver.quit();
    }
}

打印结果:

(500, 22)©2017 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173 号 京公网安备 11000002000001 号texttrue

模拟鼠标操作

通过前面例子了解到,可以使用click()来模拟鼠标的单击操作,现在的Web产品中提供了更丰富的鼠标交互方式, 例如鼠标右击、双击、悬停、甚至是鼠标拖动等功能。在WebDriver中,将这些关于鼠标操作的方法封装在ActionChains类提供。
Actions 类提供了鼠标操作的常用方法:

  • contextClick() 右击
  • clickAndHold() 鼠标点击并控制
  • doubleClick() 双击
  • dragAndDrop() 拖动
  • release() 释放鼠标
  • perform() 执行所有Actions中存储的行为

百度首页设置悬停下拉菜单。

        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.chrome.ChromeDriver;
        import org.openqa.selenium.interactions.Actions;

        public class MouseDemo {
            public static void main(String[] args) {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.com/");
                WebElement search_setting = driver.findElement(By.linkText("设置"));
                Actions action = new Actions(driver);
                action.clickAndHold(search_setting).perform();
                driver.quit();
            }
        }
  • import org.openqa.selenium.interactions.Actions;

导入提供鼠标操作的 ActionChains 类

  • Actions(driver) 调用Actions()类,将浏览器驱动driver作为参数传入。
  • clickAndHold() 方法用于模拟鼠标悬停操作, 在调用时需要指定元素定位。
  • perform() 执行所有ActionChains中存储的行为, 可以理解成是对整个操作的提交动作。

1.关于鼠标操作的其它方法

        import org.openqa.selenium.interactions.Actions;
        Actions action = new Actions(driver);
        // 鼠标右键点击指定的元素
        action.contextClick(driver.findElement(By.id("element"))).perform();
        // 鼠标右键点击指定的元素
        action.doubleClick(driver.findElement(By.id("element"))).perform();
        // 鼠标拖拽动作, 将 source 元素拖放到 target 元素的位置。
        WebElement source = driver.findElement(By.name("element"));
        WebElement target = driver.findElement(By.name("element"));
        action.dragAndDrop(source, target).perform();
        // 释放鼠标
        action.release().perform();

模拟键盘操作

Keys()类提供了键盘上几乎所有按键的方法。 前面了解到, sendKeys()方法可以用来模拟键盘输入, 除此之 外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A、 Ctrl+C 等。

        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.chrome.ChromeDriver;
        import org.openqa.selenium.By;
        import org.openqa.selenium.Keys;

        public class Keyboard {
            public static void main(String[] args) throws InterruptedException {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.com");
                WebElement input = driver.findElement(By.id("kw"));     
                //输入框输入内容    
                input.sendKeys("seleniumm");
                Thread.sleep(2000);    
                //删除多输入的一个 m    
                input.sendKeys(Keys.BACK_SPACE);
                Thread.sleep(2000);     
                //输入空格键+“教程”    
                input.sendKeys(Keys.SPACE);
                input.sendKeys("教程");
                Thread.sleep(2000);    
                //ctrl+a 全选输入框内容    
                input.sendKeys(Keys.CONTROL, "a");
                Thread.sleep(2000);     
                //ctrl+x 剪切输入框内容    
                input.sendKeys(Keys.CONTROL, "x");
                Thread.sleep(2000);    
                //ctrl+v 粘贴内容到输入框    
                input.sendKeys(Keys.CONTROL, "v");
                Thread.sleep(2000);    
                //通过回车键盘来代替点击操作    
                input.sendKeys(Keys.ENTER);
                Thread.sleep(2000);
                driver.quit();
            }
        }

需要说明的是,上面的脚本没有什么实际意义,但向我们展示了模拟键盘各种按键与组合键的用法。

  • import org.openqa.selenium.Keys;

在使用键盘按键方法前需要先导入 keys 类。

以下为常用的键盘操作:
sendKeys(Keys.BACK_SPACE) 回格键(BackSpace)
sendKeys(Keys.SPACE) 空格键(Space)
sendKeys(Keys.TAB) 制表键(Tab)
sendKeys(Keys.ESCAPE) 回退键(Esc)
sendKeys(Keys.ENTER) 回车键(Enter)
sendKeys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
sendKeys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
sendKeys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
sendKeys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
sendKeys(Keys.F1) 键盘 F1
……
sendKeys(Keys.F12) 键盘 F12

获取断言信息

不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。
我们通常可以通过获取title 、URL和text等信息进行断言。text方法在前面已经讲过,它用于获取标签对之间的文本信息。

  • getTitle(): 用于获得当前页面的title。
  • getCurrentUrl() : 用户获得当前页面的URL。
  • getText() 获取页面文本信息。

下面同样以百度为例,介绍如何获取这些信息。

        import org.openqa.selenium.By;
        import org.openqa.selenium.Keys;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.chrome.ChromeDriver;

        public class AssertDemo {
            public static void main(String[] args) throws InterruptedException {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.com");
                System.out.println("Search before================");       
                //获取当前的 title 和 url      
                System.out.printf("title of current page is %s\n", driver.getTitle());
                System.out.printf("url of current page is %s\n", driver.getCurrentUrl());       
                //百度搜索      
                WebElement search = driver.findElement(By.id("kw"));
                search.sendKeys("Selenium");
                search.sendKeys(Keys.ENTER);
                Thread.sleep(2000);
                System.out.println("Search after================");       
                //获取当前的 title 和 url      
                System.out.printf("title of current page is %s\n", driver.getTitle());
                System.out.printf("url of current page is %s\n", driver.getCurrentUrl());       
                //获取第一条搜索结果的标题     
                WebElement result = driver.findElement(By.xpath("//div[@id='content_left']/div/h3/a"));
                System.out.println(result.getText());
                driver.quit();
            }
        }

打印结果:

Search before================
title of current page is 百度一下, 你就知道
url of current page is https://www.baidu.com/ 
Search after================
title of current page is Selenium_百度搜索
url of current page is https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=Selenium&rsv_pq=9be4680700a485c1&rsv_t=e925U%2F%2B9SBTqmRI%2BuARg0%2BTCzrrZWn4jOBJkb1OS2vUjMrZsq5VblQ7toD8&rqlang=cn&rsv_enter=1&rsv_sug3=8&rsv_sug2=0&inputT=155&rsv_sug4=155Selenium - Web Browser Automation

设置元素等待

WebDriver提供了两种类型的等待:显式等待和隐式等待。

1.显示等待

WebDriver提供了显式等待方法,专门针对某个元素进行等待判断。

        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.chrome.ChromeDriver;
        import org.openqa.selenium.support.ui.WebDriverWait;
        import org.openqa.selenium.support.ui.ExpectedCondition;

        public class TimeOut01 {
            public static void main(String[] args) throws InterruptedException {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.com");     //显式等待, 针对某个元素等待   
                WebDriverWait wait = new WebDriverWait(driver, 10, 1);
                wait.until(new ExpectedCondition() {
                    @Override
                    public WebElement apply(WebDriver text) {
                        return text.findElement(By.id("kw"));
                    }
                }).sendKeys("selenium");
                driver.findElement(By.id("su")).click();
                Thread.sleep(2000);
                driver.quit();
            }
        }

WebDriverWait类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, 10, 1)
driver: 浏览器驱动。 10: 最长超时时间, 默认以秒为单位。 1: 检测的的间隔(步长) 时间, 默认为 0.5s。

2.隐式等待

WebDriver 提供了几种方法来等待元素。

  • implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
  • setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
  • pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
       import org.openqa.selenium.chrome.ChromeDriver;
       import org.openqa.selenium.WebDriver;
       import org.openqa.selenium.By;
       import java.util.concurrent.TimeUnit;

        public class TimeOut02 {
            public static void main(String[] args) {
                WebDriver driver = new ChromeDriver();     //页面加载超时时间设置为 5s    
                driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
                driver.get("https://www.baidu.com/");     //定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常    
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                driver.findElement(By.id("kw")).sendKeys("selenium");     //异步脚本的超时时间设置成 3s    
                driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
                driver.quit();
            }
        }

定位一组元素

在第(五)节我们已经学习了8种定位方法, 那8种定位方法是针对单个元素定位的, WebDriver还提供了另外8种用于定位一组元素的方法。

       import org.openqa.selenium.By;

        driver.findElements(By.id());
        driver.findElements(By.name());
        driver.findElements(By.className());
        driver.findElements(By.tagName());
        driver.findElements(By.linkText());
        driver.findElements(By.partialLinkText());
        driver.findElements(By.xpath());
        driver.findElements(By.cssSelector());

定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词 findElement 后面多了一个 s 表示复数。

       import org.openqa.selenium.By;
       import org.openqa.selenium.WebDriver;
       import org.openqa.selenium.WebElement;
       import org.openqa.selenium.chrome.ChromeDriver;
       import java.util.List;

        public class ElementsDemo {
            public static void main(String[] args) throws InterruptedException {
                WebDriver driver = new ChromeDriver();
                driver.get("https://www.baidu.com/");
                WebElement search_text = driver.findElement(By.id("kw"));
                search_text.sendKeys("selenium");
                search_text.submit();
                Thread.sleep(2000);     //匹配第一页搜索结果的标题, 循环打印    
                List search_result = driver.findElements(By.xpath("//div/div/h3"));     
                //打印元素的个数   
                System.out.println(search_result.size());     
                // 循环打印搜索结果的标题   
                for (WebElement result : search_result) {
                    System.out.println(result.getText());
                }
                System.out.println("-------我是分割线---------");     
                //打印第n结果的标题   
                WebElement text = search_result.get(search_result.size() - 10);
                System.out.println(text.getText());
                driver.quit();
            }
        }

多表单切换

在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用, WebDriver 只能在一个页面上对元素识别与 定位, 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。 这时就需要通过 switchTo().frame()方法将当前定 位的主体切换为 frame/iframe 表单的内嵌页面中。

 
     ...