3-Selenium WebDriver腳本Java代碼示例

本篇文章將介紹如下內容:


使用我們在前一個教程中創建的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();
    }
}

代碼解讀:

導入包
首先,您需要導入以下兩個包:

  1. org.openqa.selenium.* --包含實例化加載了特定Driver的新瀏覽器所需的WebDriver類;
  2. 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運行整個代碼。
按Ctrl+F11運行整個代碼
如果所有操作都正確,Eclipse將輸出“Test Passed!”
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() 方法提取 idemail的特定元素的標記名。運行時,這段代碼應該能夠正確識別標記名稱input,並將其打印到Eclipse的控制檯窗口,如下:
打印tag名稱

定位元素摘要:
元素定位的8種方式

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控制檯,注意打印的警告消息是:
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()WebDriverWaitExpectedConditions 方法的組合;
    但這並不是驗證元素是否存在,只是確定元素的一種狀態。
  • 當元素不存在時調用isEnabled()、isdisplay()或isSelected(), WebDriver將拋出NoSuchElementException
  • 當元素不存在時調用WebDriverWaitExpectedConditions方法,WebDriver將拋出TimeoutException

注意:
driver.get() :
它用於訪問特定的網站,但它不維護瀏覽器歷史記錄和cookie,所以我們不能使用前進後退按鈕;使用get()會跳轉到一個新的頁面,當有需要前進或後退到需要的頁面獲取元素時,無法再對歷史頁面來回跳轉;

driver.navigate() :
它用於訪問特定的網站,但是它維護瀏覽器歷史記錄和cookie,所以我們可以在編寫Testcase的過程中使用前進和後退按鈕在頁面之間導航,進行需要的操作或者獲取相應的信息。

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