詳解介紹Selenium常用API的使用--Java語言(完整版)

                

參考:http://www.testclass.net/selenium_java/

一共分爲二十個部分:環境安裝之Java、環境安裝之IntelliJ IDEA、環境安裝之selenium、selenium3瀏覽器驅動、selenium元素定位、控制瀏覽器操作、WebDriver常用方法、模擬鼠標操作、模擬鍵盤操作、獲取斷言信息、設置元素等待、定位一組元素、多表單切換、多窗口切換、下拉框選擇、警告框處理、文件上傳、瀏覽器cookie操作、調用JavaScript代碼、獲取窗口截屏;

(一)環境安裝之Java

1.安裝java

點擊 JDK8下載,根據自己的平臺,選擇相應的版本進行下載。

小知識:
Java環境分JDK和JRE ,JDK就是Java Development Kit。簡單的說JDK是面向開發人員使用的SDK,它提供了Java的開發
環境和運行環境。JRE是Java Runtime Enviroment是指Java的運行環境,是面向 Java 程序的使用者。

我們以 Windows安裝JDK爲例,雙擊下載的JDK,設置安裝路徑。這裏我選擇默認安裝在“D:\Program Files\Java\jdk1.8.0_101”目錄下。
下面設置環境變量:
“我的電腦” 右鍵菜單—>屬性—>高級—>環境變量—>系統變量—>新建..

變量名: JAVA_HOME
變量值: D:\Program Files\Java\jdk1.8.0_101
變量名: CALSS_PATH
變量值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

找到 path 變量名—>“編輯” 添加:

變量名: PATH
變量值: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

在Windows命令提示符(cmd)下驗證 Java 是否成功:

> java
用法: java [-options] class [args...]
           (執行類)
   或  java [-options] -jar jarfile [args...]
           (執行 jar 文件)
其中選項包括:
    -d32          使用 32 位數據模型 (如果可用)
    -d64          使用 64 位數據模型 (如果可用)
    -client       選擇 "client" VM
    -server       選擇 "server" VM
                  默認 VM 是 client.
......

> javac
用法: javac <options> <source files>
其中, 可能的選項包括:
  -g                         生成所有調試信息
  -g:none                    不生成任何調試信息
  -g:{lines,vars,source}     只生成某些調試信息
  -nowarn                    不生成任何警告
  -verbose                   輸出有關編譯器正在執行的操作的消息
  -deprecation               輸出使用已過時的 API 的源位置
  -classpath <路徑>            指定查找用戶類文件和註釋處理程序的位置

  • java 命令可以運行 class 文件字節碼。
  • javac 命令可以將 Java 源文件編譯爲 class 字節碼文件。
能讀者當前下載的 Java 版本與本書不同, 但安裝方法是一樣的。

(一)環境安裝之IntelliJ IDEA

1.安裝IntelliJ IDEA

你可能會問,爲什麼不用Eclipse呢?隨着發展IntelliJ IDEA有超越Eclipse的勢頭,JetBrains公司的IDE基本上已經一統了各家主流編程語言的江湖。考慮到 Java IDE的流行趨勢,本書中決定選用IntelliJ  IDEA。
當然, 選擇什麼樣的IDE充滿着個人喜好。你依然可以參考其它資料安裝Java IDE。這不會影響你閱讀該系列文章。 點擊 IntelliJ IDEA下載,根據自己的平臺,選擇相應的版本進行下載。
IntelliJ IDEA安裝過程省略…
如果第一次打開IntelliJ IDEA,會看到如下界面

點擊”Create New Project”選項創建新的Java項目。選擇項目類型爲Java,然後,繼續”Next”。

  • Project name: 項目名稱。
  • Project location: 項目在硬盤上的路徑。
點擊”Finish”結束項目創建完成。

2.編寫Hello World!

首先,打開IntelliJ IDEA,點擊左側項目列表,在src下面創建類文件
1)右鍵左側項目列表 src—>New —> Package 彈出窗口, 輸入包的名:javaBase。
2)右鍵左側創建的包名:java —>New —> Java Class 彈出窗口, 輸入類的名:HelloWorld。
在 HelloWorld.java 文件中編寫第一個 Java 程序。
  1. package com.java.base;
  2. public class HelloWorld {
  3.  public static void main(String[] args){
  4.    System.out.println("hello world");
  5.  }
  6. }
輸入完成, 點擊工具欄 Run 按鈕(或在代碼文件中右鍵選擇”Run ‘HelloWorld.main()’“)運行, 將會在控制檯看到“hello word” 的輸出。

(三)環境安裝之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項目。
打開pom.xml 配置Selenium。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.    <modelVersion>4.0.0</modelVersion>
  6.    <groupId>com.mvn.demo</groupId>
  7.    <artifactId>MyMvnPro</artifactId>
  8.    <version>1.0-SNAPSHOT</version>
  9.    <build>
  10.        <plugins>
  11.            <plugin>
  12.                <groupId>org.apache.maven.plugins</groupId>
  13.                <artifactId>maven-compiler-plugin</artifactId>
  14.                <configuration>
  15.                    <source>1.6</source>
  16.                    <target>1.6</target>
  17.                </configuration>
  18.            </plugin>
  19.        </plugins>
  20.    </build>
  21.    <dependencies>
  22.        <!-- selenium-java -->
  23.        <dependency>
  24.            <groupId>org.seleniumhq.selenium</groupId>
  25.            <artifactId>selenium-java</artifactId>
  26.            <version>3.4.0</version>
  27.        </dependency>
  28.    </dependencies>
  29. </project>
雖然,學習Maven需要增加你的學習成本,但如果你需要長期使用Java編程語言,或者想用Java來做更多事情的話,越早使用Maven越好!因爲它會讓的第三方包管理變得非常簡單。

3.Hello Selenium

最後,少不了要寫一個簡單的Selenium Sample來驗證Selenium安裝是否成功,打開IntelliJ IDEA 創建一個新類Itest.java
  1. package javaBase;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.chrome.ChromeDriver;
  4. public class Itest {
  5.    public static void main(String[] args) {
  6.        WebDriver driver = new ChromeDriver();
  7.        driver.get("http://www.itest.info");
  8.        String title = driver.getTitle();
  9.        System.out.printf(title);
  10.        driver.close();
  11.    }
  12. }
如果執行報錯,請看下一節,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.驗證瀏覽器驅動

驗證不同的瀏覽器驅動是否正常使用。
  1. import org.openqa.selenium.chrome.ChromeDriver;
  2. import org.openqa.selenium.firefox.FirefoxDriver;
  3. import org.openqa.selenium.edge.EdgeDriver;
  4. import org.openqa.selenium.ie.InternetExplorerDriver;
  5. import org.openqa.selenium.opera.OperaDriver;
  6. import org.openqa.selenium.phantomjs.PhantomJSDriver;
  7. ……
  8. WebDriver driver = new ChromeDriver();    //Chrome瀏覽器
  9. WebDriver driver = new FirefoxDriver();   //Firefox瀏覽器
  10. WebDriver driver = new EdgeDriver();      //Edge瀏覽器
  11. WebDriver driver = new InternetExplorerDriver();  // Internet Explorer瀏覽器
  12. WebDriver driver = new OperaDriver();     //Opera瀏覽器
  13. WebDriver driver = new PhantomJSDriver();   //PhantomJS
  14. ……

(五)selenium元素定位

1.selenium定位方法

Selenium提供了8種定位方式。
  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • xpath
  • css selector
這8種定位方式在Python 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)查看到一個元素的屬性是這樣的。
  1. <html>
  2.  <head>
  3.  <body link="#0000cc">
  4.    <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
  5.    <form id="form" class="fm" name="f" action="/s">
  6.      <span class="soutu-btn"></span>
  7.        <input id="kw" class="s_ipt" name="wd" 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種寫法,這裏列幾個常用寫法:
    1. driver.findElement(By.xpath("//*[@id='kw']"))
    2. driver.findElement(By.xpath("//*[@name='wd']"))
    3. driver.findElement(By.xpath("//input[@class='s_ipt']"))
    4. driver.findElement(By.xpath("/html/body/form/span/input"))
    5. driver.findElement(By.xpath("//span[@class='soutu-btn']/input"))
    6. driver.findElement(By.xpath("//form[@id='form']/span/input"))
    7. driver.findElement(By.xpath("//input[@id='kw' and @name='wd']"))
  • 通過css定位,css定位有N種寫法,這裏列幾個常用寫法:
    1. driver.findElement(By.cssSelector("#kw")
    2. driver.findElement(By.cssSelector("[name=wd]")
    3. driver.findElement(By.cssSelector(".s_ipt")
    4. driver.findElement(By.cssSelector("html > body > form > span > input")
    5. driver.findElement(By.cssSelector("span.soutu-btn> input#kw")
    6. driver.findElement(By.cssSelector("form#form > span > input")
接下來,我們的頁面上有一組文本鏈接。
  1. <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>
  2. <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
  • 通過link text定位:
    1. driver.findElement(By.linkText("新聞")
    2. driver.findElement(By.linkText("hao123")
  • 通過partialLink text定位:
    1. driver.findElement(By.partialLinkText("新")
    2. driver.findElement(By.partialLinkText("hao")
    3. driver.findElement(By.partialLinkText("123")
關於xpaht和css的定位比較複雜,請參考: xpath語法css選擇器

(六)控制瀏覽器操作

1.控制瀏覽器窗口大小

有時候我們希望能以某種瀏覽器尺寸找開,訪問的頁面在這種尺寸下運行。例如可以將瀏覽器設置成移動端大小(480* 800),然後訪問移動站點,對其樣式進行評估;WebDriver 提供了 manage().window().setSize()方法來設置瀏覽器的大小。
  • maximize() 設置瀏覽器最大化
  • setSize() 設置瀏覽器寬高
  1. import org.openqa.selenium.Dimension;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.chrome.ChromeDriver;
  4. public class Browser {
  5.  public static void main(String[] args) throws InterruptedException {
  6.    WebDriver driver= new ChromeDriver();
  7.    driver.get("https://www.baidu.cn");
  8.    driver.manage().window().maximize();
  9.    Thread.sleep(2000);
  10.    driver.get("https://m.baidu.cn");
  11.    driver.manage().window().setSize(new Dimension(480, 800));
  12.    Thread.sleep(2000);
  13.    driver.quit();
  14.  }
  15. }
在 PC 端執行自動化測試腳本大多的情況下是希望瀏覽器在全屏幕模式下執行, 那麼可以使用 maximize()方法使打開的瀏覽器全屏顯示, 其用法與 setSize()相同, 但它不需要任何參數。

2.控制瀏覽器後退、前進

在使用瀏覽器瀏覽網頁時,瀏覽器提供了後退和前進按鈕,可以方便地在瀏覽過的網頁之間切換,WebDriver也提供了對應的back()和forward()方法來模擬後退和前進按鈕。下面通過例子來演示這兩個方法的使用。
  • back() 模擬瀏覽器後退按鈕
  • forward() 模擬瀏覽器前進按鈕
  1. import org.openqa.selenium.WebDriver;
  2. import org.openqa.selenium.chrome.ChromeDriver;
  3. import org.openqa.selenium.By;
  4. public class BrowserGo {
  5.  public static void main(String[] args) throws InterruptedException {
  6.    WebDriver driver = new ChromeDriver();
  7.    //get 到百度首頁
  8.    driver.get("https://www.baidu.com/");
  9.    System.out.printf("now accesss %s \n", driver.getCurrentUrl());
  10.    Thread.sleep(2000);
  11.    //點擊“新聞” 鏈接
  12.    driver.findElement(By.linkText("新聞")).click();
  13.    System.out.printf("now accesss %s \n", driver.getCurrentUrl());
  14.    Thread.sleep(2000);
  15.    //執行瀏覽器後退
  16.    driver.navigate().back();
  17.    System.out.printf("back to %s \n", driver.getCurrentUrl());
  18.    Thread.sleep(2000);
  19.    //執行瀏覽器前面
  20.    driver.navigate().forward();
  21.    System.out.printf("forward to %s \n", driver.getCurrentUrl());
  22.    Thread.sleep(2000);
  23.    driver.quit();
  24.  }
  25. }
爲了看清腳本的執行過程,下面每操作一步都通過printf()方法來打印當前的URL地址。

3.刷新頁面

有時候需要手動刷新(F5) 頁面。
  • refresh() 刷新頁面(F5)
  1. ……
  2. //刷新頁面
  3. driver.navigate().refresh();
  4. ……

(七)WebDriver常用方法

前面我們已經學習了定位元素, 定位只是第一步, 定位之後需要對這個元素進行操作, 或單擊(按鈕) 或 輸入(輸入框) , 下面就來認識這些最常用的方法。 

1.WebDriver 常用方法

下面先來認識 WebDriver 中最常用的幾個方法:
  • clear() 清除文本。
  • sendKeys(*value) 模擬按鍵輸入。
  • click() 單擊元素
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. public class BaiduDemo {
  6.  public static void main(String[] args) {
  7.    WebDriver driver = new ChromeDriver();
  8.    driver.get("https://www.baidu.com/");
  9.    WebElement search_text = driver.findElement(By.id("kw"));
  10.    WebElement search_button = driver.findElement(By.id("su"));
  11.    search_text.sendKeys("Java");
  12.    search_text.clear();
  13.    search_text.sendKeys("Selenium");
  14.    search_button.click();
  15.    driver.quit();
  16.  }
  17. }
clear()方法用於清除文本輸入框中的內容。
sendKeys()方法模擬鍵盤向輸入框裏輸入內容。 但是它的作用不僅於此, 我們還可以用它發送鍵盤按鍵, 甚至用它來指定上傳的文件。
click()方法可以用來單擊一個元素,前提是它是可以被單擊的對象,它與 sendKeys()方法是Web頁面操作中最常用到的兩個方法。 其實click()方法不僅僅用於單擊一個按鈕,它還可以單擊任何可以單擊的文字/圖片鏈接、複選框、單選框、下拉框等。

2.其它常用方法

  • submit()
submit()方法用於提交表單。 例如,在搜索框輸入關鍵字之後的“回車” 操作, 就可以通過 submit()方法模擬.
  1. ……
  2. WebElement search_text = driver.findElement(By.id("kw"));
  3. search_text.sendKeys("Selenium");
  4. search_text.submit();
  5. ……
  • getSize() 返回元素的尺寸。
  • getText() 獲取元素的文本。
  • getAttribute(name) 獲得屬性值。
  • isDisplayed() 設置該元素是否用戶可見。
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. public class BaiduDemo {
  6.  public static void main(String[] args) {
  7.    WebDriver driver = new ChromeDriver();
  8.    driver.get("https://www.baidu.com/");
  9.    //獲得百度輸入框的尺寸
  10.    WebElement size = driver.findElement(By.id("kw"));
  11.    System.out.println(size.getSize());
  12.    //返回百度頁面底部備案信息
  13.    WebElement text = driver.findElement(By.id("cp"));
  14.    System.out.println(text.getText());
  15.    //返回元素的屬性值, 可以是 id、 name、 type 或元素擁有的其它任意屬性
  16.    WebElement ty = driver.findElement(By.id("kw"));
  17.    System.out.println(ty.getAttribute("type"));
  18.    //返回元素的結果是否可見, 返回結果爲 True 或 False
  19.    WebElement display = driver.findElement(By.id("kw"));
  20.    System.out.println(display.isDisplayed());
  21.    driver.quit();
  22.  }
  23. }
打印結果:
  1. (500, 22)
  2. ©2017 Baidu 使用百度前必讀 意見反饋 京 ICP 證 030173 號 京公網安備 11000002000001 號
  3. text
  4. true

(八)模擬鼠標操作

通過前面例子瞭解到,可以使用click()來模擬鼠標的單擊操作,現在的Web產品中提供了更豐富的鼠標交互方式, 例如鼠標右擊、雙擊、懸停、甚至是鼠標拖動等功能。在WebDriver中,將這些關於鼠標操作的方法封裝在ActionChains類提供。
Actions 類提供了鼠標操作的常用方法:
  • contextClick() 右擊
  • clickAndHold() 鼠標點擊並控制
  • doubleClick() 雙擊
  • dragAndDrop() 拖動
  • release() 釋放鼠標
  • perform() 執行所有Actions中存儲的行爲
百度首頁設置懸停下拉菜單。
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. import org.openqa.selenium.interactions.Actions;
  6. public class MouseDemo {
  7.  public static void main(String[] args) {
  8.    WebDriver driver = new ChromeDriver();
  9.    driver.get("https://www.baidu.com/");
  10.    WebElement search_setting = driver.findElement(By.linkText("設置"));
  11.    Actions action = new Actions(driver);
  12.    action.clickAndHold(search_setting).perform();
  13.    driver.quit();
  14.  }
  15. }
  • import org.openqa.selenium.interactions.Actions;
導入提供鼠標操作的 ActionChains 類
  • Actions(driver) 調用Actions()類,將瀏覽器驅動driver作爲參數傳入。
  • clickAndHold() 方法用於模擬鼠標懸停操作, 在調用時需要指定元素定位。
  • perform() 執行所有ActionChains中存儲的行爲, 可以理解成是對整個操作的提交動作。

1.關於鼠標操作的其它方法

  1. import org.openqa.selenium.interactions.Actions;
  2. ……
  3. Actions action = new Actions(driver);
  4. // 鼠標右鍵點擊指定的元素
  5. action.contextClick(driver.findElement(By.id("element"))).perform();
  6. // 鼠標右鍵點擊指定的元素
  7. action.doubleClick(driver.findElement(By.id("element"))).perform();
  8. // 鼠標拖拽動作, 將 source 元素拖放到 target 元素的位置。
  9. WebElement source = driver.findElement(By.name("element"));
  10. WebElement target = driver.findElement(By.name("element"));
  11. action.dragAndDrop(source,target).perform();
  12. // 釋放鼠標
  13. action.release().perform();

(九)模擬鍵盤操作

Keys()類提供了鍵盤上幾乎所有按鍵的方法。 前面瞭解到, sendKeys()方法可以用來模擬鍵盤輸入, 除此之 外, 我們還可以用它來輸入鍵盤上的按鍵, 甚至是組合鍵, 如 Ctrl+A、 Ctrl+C 等。
  1. import org.openqa.selenium.WebElement;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.chrome.ChromeDriver;
  4. import org.openqa.selenium.By;
  5. import org.openqa.selenium.Keys;
  6. public class Keyboard {
  7.  public static void main(String[] args)throws InterruptedException {
  8.    WebDriver driver = new ChromeDriver();
  9.    driver.get("https://www.baidu.com");
  10.    WebElement input = driver.findElement(By.id("kw"));
  11.    //輸入框輸入內容
  12.    input.sendKeys("seleniumm");
  13.    Thread.sleep(2000);
  14.    //刪除多輸入的一個 m
  15.    input.sendKeys(Keys.BACK_SPACE);
  16.    Thread.sleep(2000);
  17.    //輸入空格鍵+“教程”
  18.    input.sendKeys(Keys.SPACE);
  19.    input.sendKeys("教程");
  20.    Thread.sleep(2000);
  21.    //ctrl+a 全選輸入框內容
  22.    input.sendKeys(Keys.CONTROL,"a");
  23.    Thread.sleep(2000);
  24.    //ctrl+x 剪切輸入框內容
  25.    input.sendKeys(Keys.CONTROL,"x");
  26.    Thread.sleep(2000);
  27.    //ctrl+v 粘貼內容到輸入框
  28.    input.sendKeys(Keys.CONTROL,"v");
  29.    Thread.sleep(2000);
  30.    //通過回車鍵盤來代替點擊操作
  31.    input.sendKeys(Keys.ENTER);
  32.    Thread.sleep(2000);
  33.    driver.quit();
  34.  }
  35. }
需要說明的是,上面的腳本沒有什麼實際意義,但向我們展示了模擬鍵盤各種按鍵與組合鍵的用法。
  • 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() 獲取頁面文本信息。
下面同樣以百度爲例,介紹如何獲取這些信息。
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.Keys;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.WebElement;
  5. import org.openqa.selenium.chrome.ChromeDriver;
  6. public class AssertDemo {
  7.  public static void main(String[] args) throws InterruptedException {
  8.      WebDriver driver = new ChromeDriver();
  9.      driver.get("https://www.baidu.com");
  10.      System.out.println("Search before================");
  11.      //獲取當前的 title 和 url
  12.      System.out.printf("title of current page is %s\n", driver.getTitle());
  13.      System.out.printf("url of current page is %s\n", driver.getCurrentUrl());
  14.      //百度搜索
  15.      WebElement search = driver.findElement(By.id("kw"));
  16.      search.sendKeys("Selenium");
  17.      search.sendKeys(Keys.ENTER);
  18.      Thread.sleep(2000);
  19.      System.out.println("Search after================");
  20.      //獲取當前的 title 和 url
  21.      System.out.printf("title of current page is %s\n", driver.getTitle());
  22.      System.out.printf("url of current page is %s\n", driver.getCurrentUrl());
  23.      //獲取第一條搜索結果的標題
  24.      WebElement result = driver.findElement(By.xpath("//div[@id='content_left']/div/h3/a"));
  25.      System.out.println(result.getText());
  26.      driver.quit();
  27.  }
  28. }
打印結果:
  1. Search before================
  2. title of current page is 百度一下, 你就知道
  3. url of current page is https://www.baidu.com/
  4. Search after================
  5. title of current page is Selenium_百度搜索
  6. url of current page is
  7. https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=Selenium&rsv_pq=9be
  8. 4680700a485c1&rsv_t=e925U%2F%2B9SBTqmRI%2BuARg0%2BTCzrrZWn4jOBJkb1OS2vUjMrZsq5VblQ7toD8
  9. &rqlang=cn&rsv_enter=1&rsv_sug3=8&rsv_sug2=0&inputT=155&rsv_sug4=155
  10. Selenium - Web Browser Automation

(十一)設置元素等待

WebDriver提供了兩種類型的等待:顯式等待和隱式等待。

1.顯示等待

WebDriver提供了顯式等待方法,專門針對某個元素進行等待判斷。
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. import org.openqa.selenium.support.ui.WebDriverWait;
  6. import org.openqa.selenium.support.ui.ExpectedCondition;
  7. public class TimeOut01 {
  8.  public static void main(String[]args) throws InterruptedException {
  9.    WebDriver driver = new ChromeDriver();
  10.    driver.get("https://www.baidu.com");
  11.    //顯式等待, 針對某個元素等待
  12.    WebDriverWait wait = new WebDriverWait(driver,10,1);
  13.    wait.until(new ExpectedCondition<WebElement>(){
  14.      @Override
  15.      public WebElement apply(WebDriver text) {
  16.            return text.findElement(By.id("kw"));
  17.          }
  18.    }).sendKeys("selenium");
  19.    driver.findElement(By.id("su")).click();
  20.    Thread.sleep(2000);
  21.    driver.quit();
  22.  }
  23. }
WebDriverWait類是由WebDirver提供的等待方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。具體格式如下:
WebDriverWait(driver, 10, 1)
driver: 瀏覽器驅動。 10: 最長超時時間, 默認以秒爲單位。 1: 檢測的的間隔(步長) 時間, 默認爲 0.5s。

2.隱式等待

WebDriver 提供了幾種方法來等待元素。
  • implicitlyWait。識別對象時的超時時間。過了這個時間如果對象還沒找到的話就會拋出NoSuchElement異常。
  • setScriptTimeout。異步腳本的超時時間。WebDriver可以異步執行腳本,這個是設置異步執行腳本腳本返回結果的超時時間。
  • pageLoadTimeout。頁面加載時的超時時間。因爲WebDriver會等頁面加載完畢再進行後面的操作,所以如果頁面超過設置時間依然沒有加載完成,那麼WebDriver就會拋出異常。
  1. import org.openqa.selenium.chrome.ChromeDriver;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.By;
  4. import java.util.concurrent.TimeUnit;
  5. public class TimeOut02 {
  6.  public static void main(String[] args){
  7.    WebDriver driver = new ChromeDriver();
  8.    //頁面加載超時時間設置爲 5s
  9.    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
  10.    driver.get("https://www.baidu.com/");
  11.    //定位對象時給 10s 的時間, 如果 10s 內還定位不到則拋出異常
  12.    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  13.    driver.findElement(By.id("kw")).sendKeys("selenium");
  14.    //異步腳本的超時時間設置成 3s
  15.    driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
  16.    driver.quit();
  17.  }
  18. }

(十二)定位一組元素

在第(五)節我們已經學習了8種定位方法, 那8種定位方法是針對單個元素定位的, WebDriver還提供了另外8種用於定位一組元素的方法。
  1. import org.openqa.selenium.By;
  2. ......
  3. findElements(By.id())
  4. findElements(By.name())
  5. findElements(By.className())
  6. findElements(By.tagName())
  7. findElements(By.linkText())
  8. findElements(By.partialLinkText())
  9. findElements(By.xpath())
  10. findElements(By.cssSelector())
定位一組元素的方法與定位單個元素的方法類似,唯一的區別是在單詞 findElement 後面多了一個 s 表示複數。
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. import java.util.List;
  6. public class ElementsDemo {
  7.  public static void main(String[] args) throws InterruptedException {
  8.    WebDriver driver = new ChromeDriver();
  9.    driver.get("https://www.baidu.com/");
  10.    WebElement search_text = driver.findElement(By.id("kw"));
  11.    search_text.sendKeys("selenium");
  12.    search_text.submit();
  13.    Thread.sleep(2000);
  14.    //匹配第一頁搜索結果的標題, 循環打印
  15.    List<WebElement> search_result = driver.findElements(By.xpath("//div/div/h3"));
  16.    //打印元素的個數
  17.    System.out.println(search_result.size());
  18.    // 循環打印搜索結果的標題
  19.    for(WebElement result : search_result){
  20.        System.out.println(result.getText());
  21.    }
  22.    System.out.println("-------我是分割線---------");
  23.    //打印第n結果的標題
  24.    WebElement text = search_result.get(search_result.size() - 10);
  25.    System.out.println(text.getText());
  26.    driver.quit();
  27.  }
  28. }
打印結果:
  1. 15
  2. selenium java 教程-90 天從入門到高薪「學習必看」
  3. python selenium 視頻-90 天從入門到高薪「學習必看」
  4. Selenium - Web Browser Automation
  5. 功能自動化測試工具——Selenium 篇
  6. Selenium Documentation — Selenium Documentation
  7. selenium + python 自動化測試環境搭建 - 蟲師 - 博客園
  8. selenium_百度翻譯
  9. Selenium_百度百科
  10. 怎樣開始用 selenium 進行自動化測試(個人總結)_百度經驗
  11. Selenium 官網教程_selenium 自動化測試實踐_Selenium_領測軟件測試網
  12. Selenium - 開源中國社區
  13. selenium 是什麼?_百度知道
  14. selenium-0 基礎入學, 先就業後付款!
  15. selenium, 亞馬遜官網, 正品低價, 貨到付款!
  16. selenium java 教程-90 天從入門到高薪「學習必看」
  17. -------我是分割線---------
  18. selenium + python 自動化測試環境搭建 - 蟲師 - 博客園

(十三)多表單切換

在 Web 應用中經常會遇到 frame/iframe 表單嵌套頁面的應用, WebDriver 只能在一個頁面上對元素識別與 定位, 對於 frame/iframe 表單內嵌頁面上的元素無法直接定位。 這時就需要通過 switchTo().frame()方法將當前定 位的主體切換爲 frame/iframe 表單的內嵌頁面中。
  1. <html>
  2.  <body>
  3.    ...
  4.    <iframe id="x-URS-iframe" ...>
  5.      <html>
  6.         <body>
  7.           ...
  8.           <input name="email" >
126郵箱登錄框的結構大概是這樣子的,想要操作登錄框必須要先切換到iframe表單。
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. public class MailLogin {
  6.  public static void main(String[] args){
  7.    WebDriver driver = new ChromeDriver();
  8.    driver.get("http://www.126.com");
  9.    WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
  10.    driver.switchTo().frame(xf);
  11.    driver.findElement(By.name("email")).clear();
  12.    driver.findElement(By.name("email")).sendKeys("username");
  13.    driver.findElement(By.name("password")).clear();
  14.    driver.findElement(By.name("password")).sendKeys("password");
  15.    driver.findElement(By.id("dologin")).click();
  16.    driver.switchTo().defaultContent();
  17.    //……
  18.  }
  19. }
如果完成了在當前表單上的操作,則可以通過switchTo().defaultContent()方法跳出表單。

(十四)多窗口切換

在頁面操作過程中有時候點擊某個鏈接會彈出新的窗口, 這時就需要主機切換到新打開的窗口上進行操作。WebDriver提供了switchTo().window()方法可以實現在不同的窗口之間切換。
以百度首頁和百度註冊頁爲例,在兩個窗口之間的切換如下圖。

實現窗口切換的代碼如下:
  1. import java.util.Set;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. public class MoreWindows {
  6.  public static void main(String[] arge) throws InterruptedException{
  7.    WebDriver driver = new ChromeDriver();
  8.    driver.get("https://www.baidu.com");
  9.    //獲得當前窗口句柄
  10.    String search_handle = driver.getWindowHandle();
  11.    //打開百度註冊窗口
  12.    driver.findElement(By.linkText("登錄")).click();
  13.    Thread.sleep(3000);
  14.    driver.findElement(By.linkText("立即註冊")).click();
  15.    //獲得所有窗口句柄
  16.    Set<String> handles = driver.getWindowHandles();
  17.    //判斷是否爲註冊窗口, 並操作註冊窗口上的元素
  18.    for(String handle : handles){
  19.      if (handle.equals(search_handle)==false){
  20.        //切換到註冊頁面
  21.        driver.switchTo().window(handle);
  22.        System.out.println("now register window!");
  23.        Thread.sleep(2000);
  24.        driver.findElement(By.name("userName")).clear();
  25.        driver.findElement(By.name("userName")).sendKeys("user name");
  26.        driver.findElement(By.name("phone")).clear();
  27.        driver.findElement(By.name("phone")).sendKeys("phone number");
  28.        //......
  29.        Thread.sleep(2000);
  30.        //關閉當前窗口
  31.        driver.close();
  32.      }
  33.    }
  34.    Thread.sleep(2000);
  35.    driver.quit();
  36.  }
  37. }
在本例中所涉及的新方法如下:
  • getWindowHandle(): 獲得當前窗口句柄。
  • getWindowHandles(): 返回的所有窗口的句柄到當前會話。
  • switchTo().window(): 用於切換到相應的窗口,與上一節的switchTo().frame()類似,前者用於不同窗口的切換, 後者用於不同表單之間的切換。

(十五)下拉框選擇

有時我們會碰到下拉框,WebDriver提供了Select類來處理下接框。
如百度搜索設置的下拉框,如下圖:

搜索下拉框實現代碼如下:
  1. <select id="nr" name="NR">
  2.  <option value="10" selected>每頁顯示 10 條</option>
  3.  <option value="20">每頁顯示 20 條</option>
  4.  <option value="50">每頁顯示 50 條</option>
  5. <select>
操作下接框代碼如下:
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. import org.openqa.selenium.support.ui.Select;
  6. public class SelectDemo {
  7.  public static void main(String[] args) throws InterruptedException {
  8.    WebDriver driver = new ChromeDriver();
  9.    driver.get("https://www.baidu.com");
  10.    driver.findElement(By.linkText("設置")).click();
  11.    driver.findElement(By.linkText("搜索設置")).click();
  12.    Thread.sleep(2000);
  13.    //<select>標籤的下拉框選擇
  14.    WebElement el = driver.findElement(By.xpath("//select"));
  15.    Select sel = new Select(el);
  16.    sel.selectByValue("20");
  17.    Thread.sleep(2000);
  18.    driver.quit();
  19.  }
  20. }
Select類用於定位select標籤。 selectByValue()方法符用於選取<option>標籤的value值。

(十六)警告框處理

在 WebDriver中處理JavaScript所生成的alert、confirm以及prompt十分簡單,具體做法是使用switch_to_alert()方法定位到alert/confirm/prompt,然後使用text/accept/dismiss/sendKeys等方法進行操作。
  • getText(): 返回 alert/confirm/prompt 中的文字信息。
  • accept(): 接受現有警告框。
  • dismiss(): 解散現有警告框。
  • sendKeys(keysToSend): 發送文本至警告框。
  • keysToSend: 將文本發送至警告框。
如下圖,百度搜索設置彈出的窗口是不能通過前端工具對其進行定位的,這個時候就可以通過switchTo().alert()方法接受這個彈窗。

接受一個警告框的代碼如下:
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.chrome.ChromeDriver;
  4. public class AlertDemo {
  5.  public static void main(String[] args) throws InterruptedException {
  6.    WebDriver driver = new ChromeDriver();
  7.    driver.get("https://www.baidu.com");
  8.    driver.findElement(By.linkText("設置")).click();
  9.    driver.findElement(By.linkText("搜索設置")).click();
  10.    Thread.sleep(2000);
  11.    //保存設置
  12.    driver.findElement(By.className("prefpanelgo")).click();
  13.    //接收彈窗
  14.    driver.switchTo().alert().accept();
  15.    Thread.sleep(2000);
  16.    driver.quit();
  17.  }
  18. }

(十七)文件上傳

對於通過input標籤實現的上傳功能,可以將其看作是一個輸入框,即通過sendKeys()指定本地文件路徑的方式實現文件上傳。
創建upfile.html文件,代碼如下:
  1. <html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  4. <title>upload_file</title>
  5. <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
  6. </head>
  7. <body>
  8.  <div class="row-fluid">
  9.     <div class="span6 well">
  10.     <h3>upload_file</h3>
  11.       <input type="file" name="file" />
  12.     </div>
  13.  </div>
  14. </body>
  15. <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></scrip>
  16. </html>
通過瀏覽器打開upfile.html文件,功能如下圖。

接下來通過sendKeys()方法來實現文件上傳。
  1. import java.io.File;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. public class UpFileDemo {
  6.  public static void main(String[] args) throws InterruptedException {
  7.    WebDriver driver = new ChromeDriver();
  8.    File file = new File("./HTMLFile/upfile.html");
  9.    String filePath = file.getAbsolutePath();
  10.    driver.get(filePath);
  11.    //定位上傳按鈕, 添加本地文件
  12.    driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");
  13.    Thread.sleep(5000);
  14.    driver.quit();
  15.  }
  16. }

(十八)瀏覽器cookie操作

有時候我們需要驗證瀏覽器中Cookie是否正確, 因爲基於真實Cookie的測試是無法通過白盒測試和集成測試進行的。WebDriver提供了操作Cookie的相關方法可以讀取、 添加和刪除Cookie信息。
WebDriver 操作Cookie的方法:
  • getCookies() 獲得所有 cookie 信息。
  • getCookieNamed(String name) 返回字典的key爲“name”的Cookie信息。
  • addCookie(cookie dict) 添加Cookie。“cookie_dict”指字典對象,必須有 name和value值。
  • deleteCookieNamed(String name) 刪除Cookie 信息。 “name”是要刪除的 cookie的名稱; “optionsString” 是該Cookie的選項,目前支持的選項包括“路徑” , “域” 。
  • deleteAllCookies() 刪除所有 cookie 信息。
下面通過 geCookies()來獲取當前瀏覽器的 cookie 信息。
  1. import java.util.Set;
  2. import org.openqa.selenium.chrome.ChromeDriver;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.Cookie;
  5. public class CookieDemo {
  6.  public static void main(String[] args){
  7.    WebDriver driver = new ChromeDriver();
  8.    driver.get("https://www.baidu.com");
  9.    Cookie c1 = new Cookie("name", "key-aaaaaaa");
  10.    Cookie c2 = new Cookie("value", "value-bbbbbb");
  11.    driver.manage().addCookie(c1);
  12.    driver.manage().addCookie(c2);
  13.    //獲得 cookie
  14.    Set<Cookie> coo = driver.manage().getCookies();
  15.    System.out.println(coo);
  16.    //刪除所有 cookie
  17.    //driver.manage().deleteAllCookies();
  18.    driver.quit();
  19.  }
  20. }
打印結果:
[BIDUPSID=82803D3E2DAD0F5342D22C8F96B9E088; expires=星期六, 24 二月 208512:40:10 CST; path=/; domain=.baidu.com, name=key-aaaaaaa; path=/;domain=www.baidu.com, PSTM=1486301167; expires=星期六, 24 二月 2085 12:40:10 CST;path=/; domain=.baidu.com,H_PS_PSSID=1437_21094_21943_22023; path=/;domain=.baidu.com, BD_UPN=12314753; expires=星期三, 15 二月 2017 09:26:04 CST;path=/; domain=www.baidu.com, value=value-bbbbbb; path=/;domain=www.baidu.com,BAIDUID=82803D3E2DAD0F5342D22C8F96B9E088:FG=1; expires=星期六, 24 二月 208512:40:10 CST; path=/; domain=.baidu.com, BD_HOME=0; path=/;domain=www.baidu.com, __bsi=16852840641557463410_00_0_I_R_1_0303_C02F_N_I_I_0;expires=星期日, 05 二月 2017 09:26:10 CST; path=/; domain=.www.baidu.com]

(十九)調用JavaScript代碼

雖然WebDriver提供了操作瀏覽器的前進和後退方法,但對於瀏覽器滾動條並沒有提供相應的操作方法。在這種情況下,就可以藉助JavaScript來控制瀏覽器的滾動條。WebDriver提供了executeScript()方法來執行JavaScript代碼。
用於調整瀏覽器滾動條位置的JavaScript代碼如下:
  1. <!-- window.scrollTo(左邊距,上邊距); -->
  2. window.scrollTo(0,450);
window.scrollTo()方法用於設置瀏覽器窗口滾動條的水平和垂直位置。方法的第一個參數表示水平的左間距,第二個參數表示垂直的上邊距。其代碼如下:
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.Dimension;
  4. import org.openqa.selenium.chrome.ChromeDriver;
  5. import org.openqa.selenium.JavascriptExecutor;
  6. public class JSDemo {
  7.  public static void main(String[] args) throws InterruptedException{
  8.    WebDriver driver = new ChromeDriver();
  9.    //設置瀏覽器窗口大小
  10.    driver.manage().window().setSize(new Dimension(700, 600));
  11.    driver.get("https://www.baidu.com");
  12.    //進行百度搜索
  13.    driver.findElement(By.id("kw")).sendKeys("webdriver api");
  14.    driver.findElement(By.id("su")).click();
  15.    Thread.sleep(2000);
  16.    //將頁面滾動條拖到底部
  17.    ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
  18.    Thread.sleep(3000);
  19.    driver.quit();
  20.  }
  21. }
通過瀏覽器打開百度進行搜索,並且提前通過window().setSize()方法將瀏覽器窗口設置爲固定寬高顯示,目的是讓窗口出現水平和垂直滾動條。然後通過executeScript()方法執行JavaScripts代碼來移動滾動條的位置。
(二十)獲取窗口截圖
自動化用例是由程序去執行,因此有時候打印的錯誤信息並不十分明確。如果在腳本執行出錯的時候能對當前窗口截圖保存,那麼通過圖片就可以非常直觀地看出出錯的原因。 WebDriver提供了截圖函數getScreenshotAs()來截取當前窗口。
  1. import java.io.File;
  2. import java.io.IOException;
  3. import org.apache.commons.io.FileUtils;
  4. import org.openqa.selenium.OutputType;
  5. import org.openqa.selenium.WebDriver;
  6. import org.openqa.selenium.chrome.ChromeDriver;
  7. import org.openqa.selenium.TakesScreenshot;
  8. public class GetImg {
  9.  public static void main(String[] arge){
  10.    WebDriver driver = new ChromeDriver();
  11.    driver.get("https://www.baidu.com");
  12.    File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
  13.    try {
  14.      FileUtils.copyFile(srcFile,new File("d:\\screenshot.png"));
  15.    } catch (IOException e) {
  16.      e.printStackTrace();
  17.    }
  18.    driver.quit();
  19.  }
  20. }
腳本運行完成後打開D盤,就可以找到screenshot.png圖片文件了。

           
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章