1. 程式人生 > >Selenium Webdriver 簡易教程

Selenium Webdriver 簡易教程

Selenium是ThroughtWorks公司開發的一套Web自動化測試工具。

它分為三個元件:

  • Selenium IDE
  • Selenium RC (Remote Control)
  • Selenium Webdriver

Selenium IDE是firefox的一個外掛,允許測試人員錄製指令碼並回放。

Selenium RCSelenium Webdriver是測試框架,提供多種語言的API。不同的是,Selenium Webdriver以一種更底層、更靈活的方式來操作瀏覽器,並不僅僅使用javascript。這樣它可以繞開瀏覽器的沙箱限制,實現Selenium RC不支援的框架、彈出視窗、頁面導航、下拉選單、基於AJAX的UI元素等控制元件的操作。以及,Selenium Webdriver

不需要本地伺服器。

Selenium 1.x版本只包含前兩個元件。從2.0開始Webdriver加入其中。

準備工作

由於本篇教程用Java做示範,所以請先安裝JDK並配置好環境變數。

官網下載庫檔案selenium-java-2.xx.x.zip,如果官網被牆了就到CSDN去找。開啟壓縮包,selenium-java-2.25.0.jar的庫檔案,需要匯入到專案中;selenium-java-2.25.0-srcs.jar是原始碼,裡面是一些*.java檔案;lib資料夾裡面是依賴包,也要一起匯入到專案中。

除了firefox瀏覽器,其它瀏覽器基本都需要驅動,同樣請到官網下載。

瀏覽器操作

開啟瀏覽器

開啟預設路徑的firefox

WebDriver driver = new FirefoxDriver();

開啟指定路徑的firefox

System.serProperty("webdriver. firefox.bin",
                   "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();

或者

File pathToFirefoxBinary 
  = new File("C:\\Program Files\\Mozilla Firefox\\firefox.exe");
FirefoxBinary firefoxbin = new FirefoxBinary(pathToFirefoxBinary);
WebDriver driver = new FirefoxDriver(firefoxbin,null);

開啟ie(需要驅動)

System.setProperty("webdriver.ie.driver", "...\\IEDriverServer.exe")
WebDriver driver = new InternetExplorerDriver();

開啟chrome(需要驅動)

System.setProperty("webdriver.chrome.driver", "...\\chromedriver.exe" );
System.setProperty("webdriver.chrome.bin", 
                   "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
WebDriver driver = new ChromeDriver();

開啟URL

用get方法

driver.get("http://www.51.com");

或者用navigate方法,然後再呼叫to方法

driver.navigate().to("http://www.51.com");

關閉瀏覽器

用quit方法

driver.quit();

或者用close方法

driver.close();

返回當前頁面url和title

得到title

String title = driver.getTitle();

得到當前頁面url

String currentUrl = driver.getCurrentUrl();

輸出title和currenturl

System.out.println(title+"\n"+currentUrl);

其他方法

  • getWindowHandle() 返回當前的瀏覽器的視窗控制代碼
  • getWindowHandles() 返回當前的瀏覽器的所有視窗控制代碼
  • getPageSource() 返回當前頁面的原始碼

對瀏覽器的支援

HtmlUnit Driver

優點:HtmlUnit Driver不會實際開啟瀏覽器,執行速度很快。對於用FireFox等瀏覽器來做測試的自動化測試用例,執行速度通常很慢,HtmlUnit Driver無疑是可以很好地解決這個問題。

缺點:它對JavaScript的支援不夠好,當頁面上有複雜JavaScript時,經常會捕獲不到頁面元素。

使用:

WebDriver driver = new HtmlUnitDriver();

FireFox Driver

優點:FireFox Dirver對頁面的自動化測試支援得比較好,很直觀地模擬頁面的操作,對JavaScript的支援也非常完善,基本上頁面上做的所有操作FireFox Driver都可以模擬。

缺點:啟動很慢,執行也比較慢,不過,啟動之後Webdriver的操作速度雖然不快但還是可以接受的,建議不要頻繁啟停FireFox Driver。

使用:

WebDriver driver = new FirefoxDriver();

Firefox profile的屬性值是可以改變的,比如我們平時使用得非常頻繁的改變useragent的功能,可以這樣修改:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", "some UAstring");
WebDriver driver = new FirefoxDriver(profile);

InternetExplorer Driver

優點:直觀地模擬使用者的實際操作,對JavaScript提供完善的支援。

缺點:是所有瀏覽器中執行速度最慢的,並且只能在Windows下執行,對CSS以及XPATH的支援也不夠好。

使用:

WebDriver driver = new InternetExplorerDriver();

選擇器

By ID

頁面:

<input type="text" name="passwd" id="passwd-id" />

程式碼:

WebElement element = driver.findElement(By.id("passwd-id"));

By Name

頁面同上

程式碼:

WebElement e = dr.findElement(By.name("passport_51_user"));

By XPATH

WebElement element 
  = driver.findElement(By.xpath("//input[@id='passwd-id']"));

By Class Name

頁面:

<div class="cheese">
  <span>Cheddar</span>
</div>
<divclass="cheese">
  <span>Gouda</span>
</div>

程式碼:

List<WebElement> cheeses 
  = driver.findElements(By.className("cheese"));

頁面:

<a href="http://www.google.com/search?q=cheese">cheese</a>

程式碼:

WebElement cheese = driver.findElement(By.linkText("cheese"));

控制元件操作

輸入框

WebElement element = driver.findElement(By.id("passwd-id"));

//在輸入框中輸入內容:
element.sendKeys(“test”);

//將輸入框清空:
element.clear();

//獲取輸入框的文字內容:
element.getText();

單選框

WebElement radio = driver.findElement(By.id("BookMode"));

//選擇某個單選項:
radio.click();

//清空某個單選項:
radio.clear();

//判斷某個單選項是否已經被選擇:
radio.isSelected();

多選框

WebElement checkbox = driver.findElement(By.id("myCheckbox"));

//與單選框類似
checkbox.click();
checkbox.clear();
checkbox.isSelected();
checkbox.isEnabled();

按鈕

WebElement saveButton = driver.findElement(By.id("save"));

//點選按鈕:
saveButton.click();

//判斷按鈕是否enable:
saveButton.isEnabled ();

左右選擇框

也就是左邊是可供選擇項,選擇後移動到右邊的框中,反之亦然。例如:

Select lang = new Select(driver.findElement(By.id("languages")));
lang.selectByVisibleText(“English”);
WebElement addLanguage = driver.findElement(By.id("addButton"));
addLanguage.click();

表單

WebElement approve = driver.findElement(By.id("approve"));

approve.click();

//或(只適合於表單的提交)
approve.submit();

檔案上傳

WebElement adFileUpload = driver.findElement(By.id("WAP-upload"));
String filePath = "C:\test\\uploadfile\\media_ads\\test.jpg";
adFileUpload.sendKeys(filePath);

高階控制元件

取多個物件

findElements()方法可以返回一個符合條件的元素List組,例如:

List<WebElement> elements = driver.findElements(By.tagName("input"));

層級定位

不方便定位某元素時,可以先定位其父元素,再取父元素的子元素:

WebElement element = driver.findElements(By.className("login"));
List<WebElement> elements = element.findElements(By.tagName("label"));

iframe

網頁:

<html>
  <head>
    <title>FrameTest</title>
  </head>
  <body style="background-color: #990000;">
    <div id="id1">this is a div!</div>
    <iframe id="frame" frameborder="0" scrolling="no" style="left:0;position:absolute;" src="frame.html"></iframe>
  </body>
</html>

frame.html:

<html>
  <head>
    <title>this is a frame!</title>
  </head>
  <body style="background-color: #009900;">
    <div id = "div1">this is a div,too!</div>
    <label>input:</label>
    <input id = "input1"></input>
  </body>
</html>

程式碼:

//在default content定位id="id1"的div
dr.findElement(By.id("id1"));

//此時,沒有進入到id="frame"的frame中時,以下兩句會報錯
dr.findElement(By.id("div1"));//報錯
dr.findElement(By.id("input1"));//報錯

//進入id="frame"的frame中,定位id="div1"的div和id="input1"的輸入框。
dr.switchTo().frame("frame");
dr.findElement(By.id("div1"));
dr.findElement(By.id("input1"));

//此時,沒有跳出frame,如果定位default content中的元素也會報錯。
dr.findElement(By.id("id1"));//報錯

//跳出frame,進入default content;重新定位id="id1"的div
dr.switchTo().defaultContent();
dr.findElement(By.id("id1"));

彈出視窗

//得到當前視窗的控制代碼
String currentWindow = dr.getWindowHandle();

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

for(String handle : handles)
{
  if(currentWindow.equals(handle)) continue;
  WebDriver window = dr.switchTo().window(handle);
  //...
}

alert、confirm、prompt

  • getText() 得到它的文字值
  • accept() 相當於點選它的"確認"
  • dismiss() 相當於點選"取消"或者叉掉對話方塊
  • sendKeys() 輸入值
Alert alert = dr.switchTo().alert();
String text = alert.getText();
System.out.println(text);
alert.dismiss();
Alert confirm = dr.switchTo().alert();
String text1 = confirm.getText();
confirm.accept();
Alert prompt = dr.switchTo().alert();
String text2 = prompt.getText();
prompt.sendKeys("jarvi");
prompt.accept();

下拉框

頁面:

<div id="car-menu">
  <h2>品牌選擇</h2>
  <select name="cars",id="select">
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="fiat" selected="selected">Fiat</option>
    <option value="audi">Audi</option>
    <option value="bmw">BMW</option>
    <option value="Mercedes Benz ">Mercedes Benz </option>
  </select>
</div>

程式碼:

Select selectCar = new Select(dr.findElement(By.name("cars")));

// 通過下拉列表中選項的索引選中第二項,
selectCar.selectByIndex(4);

// 通過可見文字“audi”選中相應項,
selectengin.selectByVisibleText("audi");

拖放元素

WebElement ele = dr.findElement(By.id("item1"));
WebElement tar = dr.findElement(By.id("drop"));
(new Action(dr)).dragAndDrop(ele, tar).perform();

表格

下面這個例項按照原順序輸出表格中的內容:

WebElement table = driver.findElement(By.id("my-table"));
List<WebElement> rows = table.findElements(By.tagName("tr"));
for(WebElement row : rows)
{
  // 列裡面有"<th>"、"<td>"兩種標籤,所以分開處理。
  List<WebElement> heads = row.findElements(By.tagName("th"));
  for(WebElement head : heads) 
  {
    System.out.print(head.getText());
    System.out,print(" ");
  }
  List<WebElement> cols = row.findElements(By.tagName("td"));
  for(WebElement col : cols) 
  {
    System.out.print(col.getText());
    System.out,print(" ");
  }
  System.out,println();
}

Cookies

// 增加一個name = "name",value="value"的cookie
Cookie cookie = new Cookie("name", "value");
dr.manage().addCookie(cookie);

// 得到當前頁面下所有的cookies,並且輸出它們的所在域、name、value、有效日期和路徑
Set<Cookie> cookies = dr.manage().getCookies();
System.out.println(String
  .format("Domain -> name -> value -> expiry -> path"));
for (Cookie c : cookies)
System.out.println(String.format("%s -> %s -> %s -> %s -> %s",
c.getDomain(), c.getName(), c.getValue(), c.getExpiry(),c.getPath()));

// 刪除cookie有三種方法

// 第一種 通過cookie的name
dr.manage().deleteCookieNamed("CookieName");

// 第二種 通過Cookie物件
dr.manage().deleteCookie(cookie);

// 第三種 全部刪除
dr.manage().deleteAllCookies();

等待

明確等待

假設被測頁面實現了這樣的一種效果:點選click按鈕4秒鐘後,頁面上會出現一個藍色的div塊。需要寫一段自動化指令碼去捕獲這個出現的div,然後高亮它。

WebDriverWait wait = new WebDriverWait(dr, 10);
wait.until(new ExpectedCondition<WebElement>() 
{
  public WebElement apply(WebDriver d) 
  {
    return d.findElement(By.cssSelector(".blue_box"));
  }
}

程式碼WebDriverWait類的構造方法接受了一個WebDriver物件和一個等待最長時間(10秒)。然後呼叫until方法,其中重寫了ExpectedCondition介面中的apply方法,讓其返回一個WebElement,即載入完成的元素。預設情況下,WebDriverWait每500毫秒呼叫一次ExpectedCondition,直到有成功的返回,當然如果超過設定的值還沒有成功的返回,將丟擲異常。

隱性等待

隱性等待是指當要查詢元素,而這個元素沒有馬上出現時,告訴WebDriver查詢Dom一定時間。預設值是0,但是設定之後,這個時間將在WebDriver物件例項整個生命週期都起作用。

上面的程式碼可改為如下程式碼:

// 設定10秒
dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

截圖

// 這裡等待頁面載入完成
Thread.sleep(5000);

// 下面程式碼是得到截圖並儲存在D盤下
File screenShotFile 
  = ((TakesScreenshot) dr).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenShotFile, 
                   new File("E:/軟體測試課程/selenium/test.png"));

滑鼠鍵盤模擬

單一操作

//新建一個action
Actions action=new Actions(driver);

//操作
WebElement element = dr.findElement(By.id("test"));
WebElement element1 = dr.findElement(By.id("su"));
action.sendKeys(element,"test").perform();
action.moveToElement(element1);
action.click().perform();

組合操作

(new Actions(dr)).dragAndDrop(dr.findElement(By.id(item)), target).perform();
Action dragAndDrop = builder.clickAndHold(someElement)
  .moveToElement(otherElement)
  .release(otherElement)
  .build().perform();

其他滑鼠或鍵盤操作方法可以具體看一下API裡面的org.openqa.selenium.interactions.Actions類。

其它

firefox代理

String PROXY = "localhost:8080";//如果不是本機,localhost替換成IP地址
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
  .setFtpProxy(PROXY)
  .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(cap);

啟用firefox禁用的功能

FirefoxProfile profile = new FirefoxProfile();
profile.setEnableNativeEvents(true);
WebDriver driver = new FirefoxDriver(profile);

臨時指定外掛

有時需要臨時讓啟動的firefox帶一個外掛,如firebug,來定位問題等。首先要下載這個外掛的xpi安裝包。剩下的就讓selenium webdriver來完成,如下:

FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.addExtension(file);
//避免啟動畫面
firefoxProfile.setPreference("extensions.firebug.currentVersion", "1.10.1"); 
WebDriver driver = new FirefoxDriver(firefoxProfile);

部分內容來自SE225軟體測試課程課件第8章--GUI測試工具

相關推薦

Selenium Webdriver 簡易教程

Selenium是ThroughtWorks公司開發的一套Web自動化測試工具。 它分為三個元件: Selenium IDESelenium RC (Remote Control)Selenium WebdriverSelenium IDE是firefox的一個外掛,允許測

Selenium-webdriver系列教程(17)————為firefox設定下載檔案的儲存目錄

Firefox為我們提供了非常豐富的配置功能,下面的程式碼就實現了配置下載目錄的功能。 Ruby程式碼   profile = Selenium::WebDriver::Firefox::Profile.newpr

Selenium-webdriver系列教程(三)————如何執行一段js指令碼

有時候在進行自動化測試時需要在頁面上執行一段js指令碼,這個時候就需要用到execute_script方法了。 require 'selenium-webdriver' dr = Selenium::WebDriver.for :ff url = 'http://www.

Selenium-webdriver系列教程(16)————為firefox設定代理

下面的程式碼可以幫助你實現firefox測試執行時代理配置的功能。大概的思路是通過設定profile物件來進行配置。 [ruby] view plaincopyprint? profile = Selenium::WebDriver::Firefox::Profil

Selenium WebDriver基礎操作教程

最近幾個月在研究Selenium WebDriver,簡單總結一下我的入坑記。 一、在Java 環境中的安裝 1.選取合適的瀏覽器   在配置Selenium的WebDriver前首先先選定測試的瀏覽器,IE、Chrome、Firefox等主流瀏覽

總結Selenium WebDriver中一些鼠標和鍵盤事件的使用

ict 效果 control window 只需要 html 執行 text keyevent 在使用 Selenium WebDriver 做自動化測試的時候,會經常模擬鼠標和鍵盤的一些行為。比如使用鼠標單擊、雙擊、右擊、拖拽等動作;或者鍵盤輸入、快捷鍵使用、組合鍵使用

vgrant使用簡易教程

登錄 href destory list logs github gin 工具 bsp 認識vagrant vagrant用於創建和部署虛擬化開發環境 避免了多次重新配置環境 節約了開發時間,同時可以體驗不同的操作系統 對於新手也是一個不錯的方式,當我們配置出錯,直接刪

Android實戰簡易教程-第二十六槍(基於ViewPager實現微信頁面切換效果)

stat addview data android tid des viewpage 聊天 == 1.頭部布局文件top.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

敏捷團隊協作:Confluence簡易教程

模式 層級 當前 做的 記錄 我們 流程圖 會議 操作類   0、Confluence簡介     Confluence是一個企業級的Wiki軟件,可用於在企業、部門、團隊內部進行信息共享和協同編輯。   1、基礎概念     Confluence的使用並不復雜,只需掌

微信小程序簡易教程

自己 處理 代碼 ont deb ucc spa 發送 可能 各位朋友大家好,很高興我們一起來完成微信簡單小程序的搭建,眾所周知,2017年1月第一批小程序正式上線,隨後小程序如雨後春筍般的火了起來,那麽下面我給大家介紹小程序的簡易搭建教程,如下: 1、註冊微信小程序賬號

python selenium-webdriver 通過cookie登陸(十一)

circle gin == items tail login lis code 技術 上節介紹了瀏覽器的常用方法,涉及到了cookie的使用,本節介紹一下如何利用cookie進行登陸系統,這裏使用到了request模塊,我們首先利用request模塊,請求登陸地址進行登陸,

python selenium-webdriver 登錄驗證碼的處理(十二)

title strip() main ext ima 大小 ring pass 搭建 很多系統為了防止壞人,會增加各樣形式的驗證碼,做測試最頭痛的莫過於驗證碼的處理,驗證碼的處理一般分為三種方法 1.開發給我們設置一個萬能的驗證碼; 2.開發將驗證碼給屏蔽掉; 3.自己識別

selenium-webdriver定位多個元素

nbsp 根據 index 密碼 sys list aix ive word /*<div id="divId"> <input id="userid" type="text" value="liuhaixia" title="用戶名"

selenium-webdriver啟動時開啟firebug

jsp ges cti page style tex index profile http File file = new File("D:/software/firefox/firebug-2.0.16-fx.xpi"); FirefoxProfile profile =

在Jmeter中使用Selenium WebDriver完成測試

小強測試品牌 性能測試jmeter selenium webdriver 引子以下內容選自《小強軟件測試瘋狂講義》一書正文首先不得不感嘆Jmeter的日漸強大,尤其是其插件。之前我們講解過,Jmeter可以完成性能測試、接口測試,而這次它居然可以依靠WebDriver來完成GUI的功能自動化測試了

web自動化測試從入門到持續集成(selenium webdriver

spa 我們 右鍵 退出 頁面 exce pom.xml文件 -c err   在很多剛學習自動化的可能會認為我只需要會運用selenium,我只需要在一個編輯器中實用selenium +java編寫了一些腳本那麽就會自動化了,是真的嗎?答案肯定是假的。自動化肯定是需要做到

Selenium-WebDriver自學】Selenium-IDE驗證點(五)

tel 用例 正常 程序 同時 兩種方法 col image 執行 =======================================================================================================

Selenium-WebDriver自學】Selenium-IDE測試創建(三)

html 位置 當我 模塊 mage baidu 用例 問題 測試 =======================================================================================================

Selenium-WebDriver自學】Selenium-IDE調試(四)

ges 軟件開發 上下 eight 故障 繼續 debugger idt ive ================================================================================================

Selenium-WebDriver自學】Selenium-IDE工具特點(二)

復制 title 文檔 比較 src 面板 默認 bdr ble ========================================================================================================