本篇文章將介紹如下內容:
使用我們在前一個教程中創建的Java類“MyClass”,讓我們嘗試創建一個WebDriver腳本,它將:
1、跳轉到MercuryTours的主頁(Demo頁面);
2、驗證其主頁的標題(Title);
3、打印出比較的結果;
4、在結束整個程序之前關閉它。
WebDriver代碼
以下是上面場景提供的邏輯實際WebDriver代碼:
注意: 自從Firefox 35開始,需要使用Mozilla創建的Gecko;Selenium 3.0、gecko和firefox存在兼容性問題,正確設置它們可能會成爲一項艱鉅的任務。如果代碼不能工作,將其降級到Firefox47或更低版本。或者,你也可以在Chrome上運行你的腳本。Selenium在Chrome中開箱即用。你只需要改變3行代碼,使你的腳本與Chrome或Firefox兼容:
package newpackage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
//註釋上面的行和取消註釋下面的行來使用Chrome
//import org.openqa.selenium.chrome.ChromeDriver;
public class PG1 {
public static void main(String[] args) {
// 對象/變量的聲明和實例化
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
//註釋以上兩行代碼,取消下面兩行代碼的註釋,以使用Chrome
//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");
//WebDriver driver = new ChromeDriver();
String baseUrl = "http://demo.guru99.com/test/newtours/";
String expectedTitle = "Welcome: Mercury Tours";
String actualTitle = "";
// 啓動Fire fox並將其指向基本URL
driver.get(baseUrl);
// 獲取標題的實際值
actualTitle = driver.getTitle();
/*
* 將頁面的實際標題與預期標題進行比較並打印
* 結果爲“Passed”或“Failed”
*/
if (actualTitle.contentEquals(expectedTitle)){
System.out.println("Test Passed!");
} else {
System.out.println("Test Failed");
}
//關閉瀏覽器
driver.close();
}
}
代碼解讀:
導入包
首先,您需要導入以下兩個包:
- org.openqa.selenium.* --包含實例化加載了特定Driver的新瀏覽器所需的WebDriver類;
- org.openqa.selenium.firefox.FirefoxDriver --包含將特定於Firefox的driver實例化到WebDriver類實例化的瀏覽器所需的FirefoxDriver類;
如果您的測試需要更復雜的操作,比如訪問另一個類、獲取瀏覽器截圖或操作外部文件,那麼您肯定需要導入更多的包。
實例化對象和變量
通常,這是驅動程序(Driver)對象的實例化方式:
//Firefox
WebDriver driver = new FirefoxDriver();
//Chrome
WebDriver driver = new ChromeDriver();
沒有參數的FirefoxDriver類意味着我們的Java程序將啓動默認的Firefox配置文件。默認Firefox配置文件類似於以安全模式啓動Firefox(不加載擴展)。
爲了方便起見,我們將基本URL和期望的標題保存爲變量。
啓動瀏覽器會話
WebDriver的get() 方法用於啓動一個新的瀏覽器會話,並將其定向到作爲參數指定的URL。
driver.get(baseUrl);
獲取實際的頁面標題
WebDriver類具有getTitle() 方法,該方法總是用於獲取當前加載頁面的頁面標題。
actualTitle = driver.getTitle();
比較預期值和實際值
這部分代碼只是使用一個基本的Java if-else 結構來比較實際標題和預期標題:
if(actualTitle.contentEquals(expectedTitle)){
System.out.print("Test Passed!");
} else {
System.out.print("Test Failed!");
}
關閉瀏覽器會話
close()方法用於關閉瀏覽器窗口。
driver.close();
終止整個程序
如果你在沒有先關閉所有瀏覽器窗口的情況下使用此命令,你的整個Java程序將在瀏覽器窗口打開時結束。
System.exit(0)
運行測試
在Eclipse IDE中執行代碼有兩種方法。
1、在Eclipse的菜單欄上,單擊Run > Run;
2、按Ctrl+F11運行整個代碼。
如果所有操作都正確,Eclipse將輸出“Test Passed!”
Selenium定位UI元素
在WebDriver中定位元素是通過使用"findElement(by.locator()"方法來完成的。
以下是在WebDriver中定位元素的可用選項:
- By.className
- By.cssSelector
- By.id
- By.linkText
- By.name
- By.partialLinkText
- By.tagName
- By.xpath
下面是根據id定位元素的示例代碼。Facebook用作基本URL:
package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PG2 {
public static void main(String[] args) {
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String baseUrl = "http://www.facebook.com";
String tagName = "";
driver.get(baseUrl);
tagName = driver.findElement(By.id("email")).getTagName();
System.out.println(tagName);
driver.close();
System.exit(0);
}
}
我們使用getTagName() 方法提取 id爲email的特定元素的標記名。運行時,這段代碼應該能夠正確識別標記名稱input,並將其打印到Eclipse的控制檯窗口,如下:
定位元素摘要:
Selenium常用命令:
實例化Web元素
在每次訪問特定元素時,我們可以爲它實例化一個WebElement對象,而不是使用冗長的driver.findElement(By.locator() 語法。
WebElement類包含在org.openqa.selenium.* 包中。
WebElement myElement = driver.findElement(By.id("username"));
myElement.sendKeys("tutorial");
單擊元素
單擊可能是與Web元素交互的最常見方式。Click()方法用於模擬元素的單擊。下面的例子展示瞭如何使用Click()單擊Mercury Tours主頁的Sign-In按鈕:
driver.findElement(By.name("login")).click();
使用**click()**方法時必須注意以下事項:
- 它不接受任何參數;
- 如果適用,該方法將自動等待加載新頁面;
- 要選中的元素必須是可見的(高度和寬度不能等於零)。
.
.
Get命令 --Get Commands
Get命令獲取關於頁面/元素的各種重要信息。下面是一些您必須熟悉的重要get命令。
- get()
- getTitle()
- getPageSource()
- getCurrentUrl()
- getText()
1、 get(url) 示例用法:
- 它會自動打開一個新的瀏覽器窗口,並跳轉到括號內指定的url頁面。
- 參數必須是字符串對象。
2、getTitle() 示例用法:
- 不需要參數
- 獲取當前頁的標題
- 去掉title字符串前後的空白
- 如果頁面沒有標題,則返回空字符串
3、getPageSource() 示例用法:
- 不需要參數
- 以字符串值的形式返回頁面的源代碼
4、getCurrentUrl() 示例用法:
- 不需要參數
- 獲取瀏覽器當前URL
5、getText() 示例用法:
- 獲取指定元素的內部文本
導航(跳轉)命令-Navigate commands
這些命令允許您刷新、進入和在不同的Web頁面之間來回切換。
- navigate().forward()
- navigate().back()
- navigate().to()
- navigate().refresh()
1、navigate().to() 示例用法:
- 它會自動打開一個新的瀏覽器窗口,並跳轉到括號內指定的url頁面;
- 它的作用與get()方法完全相同。
2、navigate().refresh() 示例用法:
- 不需要參數
- 刷新當前頁面
3、navigate().back() 示例用法:
- 不需要參數
- 返回上一個歷史頁面
4、navigate().forward() 示例用法:
- 不需要參數
- 進入下一個歷史頁面
Close和Quite關閉和退出瀏覽器窗口
1、 close() 示例用法:
- 不需要參數
- 它只關閉WebDriver控制的當前瀏覽器窗口;關閉單個瀏覽器窗口
2、quite() 示例用法:
- 不需要參數
- 使用quit()關閉與WebDriver對象所控制的父窗口關聯的所有窗口。
切換內嵌框架Frame
要訪問框架中的GUI元素,我們應該首先引導WebDriver將焦點放在框架或彈出窗口上,然後才能訪問其中的元素。讓我們以web頁面http://demo.guru99.com/selenium/deprecated.html:
這個頁面有3個框架,上面顯示了它們的name屬性。我們希望訪問上面黃色包圍的“Deprecated”鏈接。爲了做到這一點,我們必須首先命令WebDriver使用switchTo().frame() 方法切換到classFrame 框架。我們將使用框架的name屬性作爲frame()部分的參數。
package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PG4 {
public static void main(String[] args) {
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://demo.guru99.com/selenium/deprecated.html");
driver.switchTo().frame("classFrame");
driver.findElement(By.linkText("Deprecated")).click();
driver.close();
}
}
執行此代碼後,您將看到classFrame框架被切換到Deprecated API頁面,這意味着我們的代碼成功地訪問了Deprecated鏈接。
切換到彈出框
WebDriver允許顯示諸如警告之類的彈出窗口。要訪問警報中的元素(比如它包含的消息),必須使用switchTo().alert() 方法。
在下面的代碼中,我們將使用此方法訪問警報框,然後使用getText() 方法檢索其消息,然後使用switchTo().alert().accept() 方法自動關閉警報框。
首先,跳轉到http://jsbin.com/usidix/1,手動單擊那裏的Go! 按鈕,看到如下:
WebDriver代碼如下:
package mypackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class myclass {
public static void main(String[] args) {
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String alertMessage = "";
driver.get("http://jsbin.com/usidix/1");
driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click();
alertMessage = driver.switchTo().alert().getText();
driver.switchTo().alert().accept();
System.out.println(alertMessage);
driver.quit();
}
}
在Eclipse控制檯,注意打印的警告消息是:
總結:
- 要開始使用WebDriver API,您必須至少導入這兩個包。
- org.openqa.selenium.*
- org.openqa.selenium.firefox.FirefoxDriver
- 在WebDriver中定位元素是使用findElement() 方法完成的。
- switchTo().frame() 和switchTo().alert() 方法分別用於將WebDriver的焦點切換到框架或警報彈窗上。
- 隱式等待(Implicit waits) 用於整個頁面中設置等待時間;而顯式等待(explicit waits) 僅用於等待特定的部分。
- 在驗證元素的狀態時,可以使用isEnabled()、isdisplay()、isSelected() 和WebDriverWait 和ExpectedConditions 方法的組合;
但這並不是驗證元素是否存在,只是確定元素的一種狀態。 - 當元素不存在時調用isEnabled()、isdisplay()或isSelected(), WebDriver將拋出NoSuchElementException。
- 當元素不存在時調用WebDriverWait和ExpectedConditions方法,WebDriver將拋出TimeoutException。
注意:
driver.get() :
它用於訪問特定的網站,但它不維護瀏覽器歷史記錄和cookie,所以我們不能使用前進和後退按鈕;使用get()會跳轉到一個新的頁面,當有需要前進或後退到需要的頁面獲取元素時,無法再對歷史頁面來回跳轉;
driver.navigate() :
它用於訪問特定的網站,但是它維護瀏覽器歷史記錄和cookie,所以我們可以在編寫Testcase的過程中使用前進和後退按鈕在頁面之間導航,進行需要的操作或者獲取相應的信息。