1. 程式人生 > >詳解介紹Selenium常用API的使用--Java語言(完整版)

詳解介紹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 程式。
package com.java.base;

public class HelloWorld {
  public static void main(String[] args){
    System.out.println("hello world");
  }
}
輸入完成, 點選工具欄 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。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mvn.demo</groupId>
    <artifactId>MyMvnPro</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>

        <!-- selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.4.0</version>
        </dependency>

    </dependencies>

</project>
雖然,學習Maven需要增加你的學習成本,但如果你需要長期使用Java程式語言,或者想用Java來做更多事情的話,越早使用Maven越好!因為它會讓的第三方包管理變得非常簡單。

3.Hello Selenium

最後,少不了要寫一個簡單的Selenium Sample來驗證Selenium安裝是否成功,開啟IntelliJ IDEA 建立一個新類Itest.java
package javaBase;

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.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.opera.OperaDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;

……

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種定位方式在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)檢視到一個元素的屬性是這樣的。
<html>
  <head>
  <body link="#0000cc">
    <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
    <form id="form" class="fm" name="f" action="/s">
      <span class="soutu-btn"></span>
        <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種寫法,這裡列幾個常用寫法:
    driver.findElement(By.xpath("//*[@id='kw']"))
    driver.findElement(By.xpath("//*[@name='wd']"))
    driver.findElement(By.xpath("//input[@class='s_ipt']"))
    driver.findElement(By.xpath("/html/body/form/span/input"))
    driver.findElement(By.xpath("//span[@class='soutu-btn']/input"))
    driver.findElement(By.xpath("//form[@id='form']/span/input"))
    driver.findElement(By.xpath("//input[@id='kw' and @name='wd']"))
  • 通過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")
接下來,我們的頁面上有一組文字連結。
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
  • 通過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 號
text
true

(八)模擬滑鼠操作

通過前面例子瞭解到,可以使用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=9be
4680700a485c1&rsv_t=e925U%2F%2B9SBTqmRI%2BuARg0%2BTCzrrZWn4jOBJkb1OS2vUjMrZsq5VblQ7toD8
&rqlang=cn&rsv_enter=1&rsv_sug3=8&rsv_sug2=0&inputT=155&rsv_sug4=155
Selenium - 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<WebElement>(){
      @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;
......
findElements(By.id())
findElements(By.name())
findElements(By.className())
findElements(By.tagName())
findElements(By.linkText())
findElements(By.partialLinkText())
findElements(By.xpath())
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<WebElement> 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();
  }
}
列印結果:
15
selenium java 教程-90 天從入門到高薪「學習必看」
python selenium 視訊-90 天從入門到高薪「學習必看」
Selenium - Web Browser Automation
功能自動化測試工具——Selenium 篇
Selenium Documentation — Selenium Documentation
selenium + python 自動化測試環境搭建 - 蟲師 - 部落格園
selenium_百度翻譯
Selenium_百度百科
怎樣開始用 selenium 進行自動化測試(個人總結)_百度經驗
Selenium 官網教程_selenium 自動化測試實踐_Selenium_領測軟體測試網
Selenium - 開源中國社群
selenium 是什麼?_百度知道
selenium-0 基礎入學, 先就業後付款!
selenium, 亞馬遜官網, 正品低價, 貨到付款!
selenium java 教程-90 天從入門到高薪「學習必看」
-------我是分割線---------
selenium + python 自動化測試環境搭建 - 蟲師 - 部落格園

(十三)多表單切換

在 Web 應用中經常會遇到 frame/iframe 表單巢狀頁面的應用, WebDriver 只能在一個頁面上對元素識別與 定位, 對於 frame/iframe 表單內嵌頁面上的元素無法直接定位。 這時就需要通過 switchTo().frame()方法將當前定 位的主體切換為 frame/iframe 表單的內嵌頁面中。
<html>
  <body>
    ...
    <iframe id="x-URS-iframe" ...>
      <html>
         <body>
           ...
           <input name="email" >
126郵箱登入框的結構大概是這樣子的,想要操作登入框必須要先切換到iframe表單。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;


public class MailLogin {

  public static void main(String[] args){

    WebDriver driver = new ChromeDriver();
    driver.get("http://www.126.com");

    WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
    driver.switchTo().frame(xf);
    driver.findElement(By.name("email")).clear();
    driver.findElement(By.name("email")).sendKeys("username");
    driver.findElement(By.name("password")).clear();
    driver.findElement(By.name("password")).sendKeys("password");
    driver.findElement(By.id("dologin")).click();
    driver.switchTo().defaultContent();
    //……
  }
}
如果完成了在當前表單上的操作,則可以通過switchTo().defaultContent()方法跳出表單。

(十四)多視窗切換

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

實現視窗切換的程式碼如下:
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class MoreWindows {

  public static void main(String[] arge) throws InterruptedException{

    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");

    //獲得當前視窗控制代碼
    String search_handle = driver.getWindowHandle();

    //開啟百度註冊視窗
    driver.findElement(By.linkText("登入")).click();
    Thread.sleep(3000);
    driver.findElement(By.linkText("立即註冊")).click();

    //獲得所有視窗控制代碼
    Set<String> handles = driver.getWindowHandles();

    //判斷是否為註冊視窗, 並操作註冊視窗上的元素
    for(String handle : handles){
      if (handle.equals(search_handle)==false){
        //切換到註冊頁面
        driver.switchTo().window(handle);
        System.out.println("now register window!");
        Thread.sleep(2000);
        driver.findElement(By.name("userName")).clear();
        driver.findElement(By.name("userName")).sendKeys("user name");
        driver.findElement(By.name("phone")).clear();
        driver.findElement(By.name("phone")).sendKeys("phone number");
        //......
        Thread.sleep(2000);
        //關閉當前視窗
        driver.close();
      }
    }
    Thread.sleep(2000);

    driver.quit();
  }
}
在本例中所涉及的新方法如下:
  • getWindowHandle(): 獲得當前視窗控制代碼。
  • getWindowHandles(): 返回的所有視窗的控制代碼到當前會話。
  • switchTo().window(): 用於切換到相應的視窗,與上一節的switchTo().frame()類似,前者用於不同視窗的切換, 後者用於不同表單之間的切換。

(十五)下拉框選擇

有時我們會碰到下拉框,WebDriver提供了Select類來處理下接框。
如百度搜索設定的下拉框,如下圖:
搜尋下拉框實現程式碼如下:
<select id="nr" name="NR">
  <option value="10" selected>每頁顯示 10 條</option>
  <option value="20">每頁顯示 20 條</option>
  <option value="50">每頁顯示 50 條</option>
<select>
操作下接框程式碼如下:
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.Select;


public class SelectDemo {

  public static void main(String[] args) throws InterruptedException {

    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");

    driver.findElement(By.linkText("設定")).click();
    driver.findElement(By.linkText("搜尋設定")).click();
    Thread.sleep(2000);

    //<select>標籤的下拉框選擇
    WebElement el = driver.findElement(By.xpath("//select"));
    Select sel = new Select(el);
    sel.selectByValue("20");
    Thread.sleep(2000);

    driver.quit();
  }
}
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()方法接受這個彈窗。

接受一個警告框的程式碼如下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


public class AlertDemo {

  public static void main(String[] args) throws InterruptedException {

    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");

    driver.findElement(By.linkText("設定")).click();
    driver.findElement(By.linkText("搜尋設定")).click();
    Thread.sleep(2000);

    //儲存設定
    driver.findElement(By.className("prefpanelgo")).click();

    //接收彈窗
    driver.switchTo().alert().accept();
    Thread.sleep(2000);

    driver.quit();
  }
}

(十七)檔案上傳

對於通過input標籤實現的上傳功能,可以將其看作是一個輸入框,即通過sendKeys()指定本地檔案路徑的方式實現檔案上傳。
建立upfile.html檔案,程式碼如下:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>upload_file</title>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
  <div class="row-fluid">
	<div class="span6 well">
	<h3>upload_file</h3>
	  <input type="file" name="file" />
	</div>
  </div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></scrip>
</html>
通過瀏覽器開啟upfile.html檔案,功能如下圖。
接下來通過sendKeys()方法來實現檔案上傳。
import java.io.File;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


public class UpFileDemo {

  public static void main(String[] args) throws InterruptedException {

    WebDriver driver = new ChromeDriver();
    File file = new File("./HTMLFile/upfile.html");
    String filePath = file.getAbsolutePath();
    driver.get(filePath);

    //定位上傳按鈕, 新增本地檔案
    driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");
    Thread.sleep(5000);

    driver.quit();
  }
}

(十八)瀏覽器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 資訊。
import java.util.Set;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Cookie;


public class CookieDemo {

  public static void main(String[] args){

    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");

    Cookie c1 = new Cookie("name", "key-aaaaaaa");
    Cookie c2 = new Cookie("value", "value-bbbbbb");
    driver.manage().addCookie(c1);
    driver.manage().addCookie(c2);

    //獲得 cookie
    Set<Cookie> coo = driver.manage().getCookies();
    System.out.println(coo);

    //刪除所有 cookie
    //driver.manage().deleteAllCookies();

    driver.quit();
  }
}
列印結果:
[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程式碼如下:
<!-- window.scrollTo(左邊距,上邊距); -->
window.scrollTo(0,450);
window.scrollTo()方法用於設定瀏覽器視窗滾動條的水平和垂直位置。方法的第一個引數表示水平的左間距,第二個引數表示垂直的上邊距。其程式碼如下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.JavascriptExecutor;


public class JSDemo {


  public static void main(String[] args) throws InterruptedException{


    WebDriver driver = new ChromeDriver();


    //設定瀏覽器視窗大小
    driver.manage().window().setSize(new Dimension(700, 600));
    driver.get("https://www.baidu.com");


    //進行百度搜索
    driver.findElement(By.id("kw")).sendKeys("webdriver api");
    driver.findElement(By.id("su")).click();
    Thread.sleep(2000);


    //將頁面滾動條拖到底部
    ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
    Thread.sleep(3000);


    driver.quit();
  }
}
通過瀏覽器開啟百度進行搜尋,並且提前通過window().setSize()方法將瀏覽器視窗設定為固定寬高顯示,目的是讓窗口出現水平和垂直滾動條。然後通過executeScript()方法執行JavaScripts程式碼來移動滾動條的位置。
(二十)獲取視窗截圖
自動化用例是由程式去執行,因此有時候列印的錯誤資訊並不十分明確。如果在指令碼執行出錯的時候能對當前視窗截圖儲存,那麼通過圖片就可以非常直觀地看出出錯的原因。 WebDriver提供了截圖函式getScreenshotAs()來擷取當前視窗。
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.TakesScreenshot;

public class GetImg {

  public static void main(String[] arge){

    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");

    File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    try {
      FileUtils.copyFile(srcFile,new File("d:\\screenshot.png"));
    } catch (IOException e) {
      e.printStackTrace();
    }

    driver.quit();
  }
}
指令碼執行完成後開啟D盤,就可以找到screenshot.png圖片檔案了。

相關推薦

介紹Selenium常用API的使用--Java語言整版

參考:http://www.testclass.net/selenium_java/ 一共分為二十個部分:環境安裝之Java、環境安裝之IntelliJ IDEA、環境安裝之selenium、selenium3瀏覽器驅動、selenium元素定位、控制瀏覽器操作、WebDr

介紹JUnit單元測試框架整版

(一)JUnit介紹 目錄 2.例子 例子 例子 1.什麼是單元測試? 單元測試負責對最小的軟體設計單元(模組)進行驗證,根據軟體設計文件中

Python中的生成器表達式generator expression

新元素 括號 tuple 列表推導式 特點 解析式 表達式 但是 bracket      介紹     1、生成器表達式(generator expression)也叫生成器推導式或生成器解析式,用法與列表推導式非常相似,在形式上生成器推導式使用圓括號(parenth

ALSA音效卡驅動中的DAPM之七:dapm事件機制dapm event

前面的六篇文章,我們已經討論了dapm關於動態電源管理的有關知識,包括widget的建立和初始化,widget之間的連線以及widget的上下電順序等等。本章我們準備討論dapm框架中的另一個機制:事件機制。通過dapm事件機制,widget可以對它所關心的dapm事

ZCU106開發之PS側MIO閃燈重磅推出

感謝大家兩週的等待!!本週連發兩篇!!!!  最近團隊事情比較多,在忙ZCU106的視訊處理方面的開發實現了編解碼,RTSP視訊流,影象疊加等應用。如果有朋友想了解更多相關資訊請加QQ群836535064。我們會將相關資料釋出於QQ群中。 歡迎有需求的朋友深度合作。本團隊

OpenLayers官方示例八之滑鼠位置控制元件Mouse Position

目錄 一、示例簡介 二、程式碼詳解 一、示例簡介     使用滑鼠位置控制元件(ol/control/MousePosition)來動態顯示地圖上滑鼠游標的座標     並且可以由使用者調整投影和座標精度。 二、程式碼詳解 &l

OpenLayers官方示例六之線串箭頭樣式LineString Arrows

目錄 一、示例簡介 二、程式碼詳解   三、總結 一、示例簡介     為每一個線串(LineString)的子線段繪製箭頭。 二、程式碼詳解  <!DOCTYPE html> <html lang=

OpenLayers官方示例十五之比例尺控制元件Scale Line

目錄   一、示例簡介 二、程式碼詳解 一、示例簡介     本示例展示瞭如何建立一個比例尺控制元件(ol.control.ScaleLine),同時讓比例尺控制元件的單位根據使用者的選擇而改變。     OpenLaye

深度學習的可解釋性研究上篇

作者 | 王小賤來源 | BIGSCity知乎專欄摘要:《深度學習的可解釋性研究》系列文章希望能

看這一篇就夠啦!微信小程式入門與實戰,橫掃常用元件API開發技巧整版包含全部原始碼

第1章:什麼是微信小程式? 1 開篇及課程特色介紹 2 直觀感受一下微信小程式 3 小程式適合做什麼樣的應用 4 對開發者的影響 5 學習基礎 6 小作業 第2章:小程式環境大件與開發工具介紹 1 開篇介紹及下載工具 2 小程式目前情況及限制 3 小程式開發

實錄 | 曠視研究院COCO2017人體姿態估計冠軍論文PPT+視訊

主講人:王志成 | 曠視研究院研究員屈鑫 整理編輯量子位 出品 | 公眾號 QbitAI12月1

零基礎學Java語言浙江大學 第五週 程式設計題

一個多項式可以表達為x的各次冪與係數乘積的和,比如:2x6+3x5+12x3+6x+20現在,你的程式要讀入兩個多項式,然後輸出這兩個多項式的和,也就是把對應的冪上的係數相加然後輸出。程式要處理的冪最大為100。輸入格式:總共要輸入兩個多項式,每個多項式的輸入格式如下:每行輸入兩個數字,第一個表示冪次,第二個

【劍指offer】Java版代碼整版

從尾到頭打印鏈表 .net 字符串 刪除 ron 代碼下載 逆序 鏈表 撲克 原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一、引言 《劍指offer》可謂是程序猿面試的神書了,在面試中幫了我很

Java web專案釋出,伺服器部署整版

本文章只為幫助大家學習專案的釋出,為基礎篇,在此給大家示範在window環境下的專案部署及運維。 以下版本為講解示例,可自行改至匹配版本。 伺服器:window service2008 R2 Standard(提前準備好伺服器,可以在伺服器商家租伺服器,這裡就不過多講解了

【劍指offer】Java版程式碼整版

一、引言 《劍指offer》可謂是程式猿面試的神書了,在面試中幫了我很多,大部分面試的演算法題都會遇到原題或者是類似的題。但是書上的程式碼都是C版的,我在這裡整理了一份Java版的程式碼供大家學習參考,這些程式碼我都是在OJ上跑過全AC的,所以正確性你大可放心

Go語言程式設計整版.epub

【下載地址】《Go語言程式設計》首先引 領讀者快速瀏覽Go 語言的全貌,迅速消除讀者對這門語言的陌生感,然後循序漸進地介紹了Go 語言的面向程和麵向物件的程式設計語法,其中穿插了一些與其他主流語言的比較以讓讀者理解Go 語言的設計動機,接著探討了Go 語言重要的並行程式設計方

C語言——PE檔案解析整版

此次PE檔案解析的內容:PE頭、節表、匯入表、匯出表、重定位表 語言:C語言 編譯器:VS2013 執行環境:win10 注:由於時間(懶)關係,備註的比較少,看不懂的地方,歡迎留言一起交流,也歡迎指正不當之處 #include <stdio.h> #i

C語言實現快速排序整版DVE-C++編譯通過

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINES 5000  //進行排序的最大文字行 char *lineptr[MAXLINES];  //指向文字行的指標陣列 i

Java併發十八:阻塞佇列BlockingQueue BlockingQueue阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

第四天:JAVA中的迴圈語句,和常用例子

1:switch語句(掌握)(1)格式:switch(表示式) {case 值1:語句體1;break;case 值2:語句體2;break;...default:語句體n+1;break;}格式解釋說明:switch:說明這是switch語句。表示式:可以是byte,short,int,charJDK5以後