1. 程式人生 > >Selenium WebDriver基礎操作教程

Selenium WebDriver基礎操作教程

最近幾個月在研究Selenium WebDriver,簡單總結一下我的入坑記。

一、在Java 環境中的安裝

1.選取合適的瀏覽器

  在配置Selenium的WebDriver前首先先選定測試的瀏覽器,IE、Chrome、Firefox等主流瀏覽器。不同的瀏覽器需要不同的驅動來實現。Firefox是自帶驅動,不需要下載驅動,IE、Chrome等需要下載相應的驅動。

  下載驅動後,放到相應的資料夾下。

2.下載selenium-server包

  selenium-server-standalone包是Seleniumd的核心jar包,其中包含了各種元素定位和呼叫瀏覽器的方法。下載jar包後,在IDE中匯入jar包就可以了。

二、基礎元素操作的8種方式

在selenium中通常用findElement或findElements與By類結合來定位頁面的元素,By類有8種常用的定位方式,如下:

1.By.id()

測試頁面原始碼:

<a id="wechatAuthorizationUrl" href="javascript:void(0)" onclick="show();" class="wechat" target="_parent"></a>

點選頁面中該元素的程式碼如下:

@Test
    public void test_01_id() throws InterruptedException {
        System.setProperty("webdriver.chrome.driver"
, "/Users/nano/程式碼/Jessie/Driver/chromedriver"); WebDriver driver = new ChromeDriver(); WebDriverWait wait = new WebDriverWait(driver, 10); driver.get("https://passport.csdn.net/account/login?ref=toolbar"); wait.until(ExpectedConditions.presenceOfElementLocated(By.id("wechatAuthorizationUrl"
))); driver.findElement(By.id("wechatAuthorizationUrl")).click(); }

(之後的演示程式碼我就只貼操作的那部分程式碼啦)

id定位方法是通過元素的id屬性來定位的,這個方法一般只適用於該頁面中這個id是唯一的情況下。

2.By.name()

測試頁面原始碼:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

向頁面中該輸入框中輸入字元:

driver.findElement(By.name("wd")).sendKeys("test");

通過元素的name屬性來定位。

3.By.tagName()

測試頁面原始碼:

<a href="/" id="result_logo" onmousedown="return c({'fm':'tab','tab':'logo'})"><img src="//www.baidu.com/img/baidu_jgylogo3.gif" alt="到百度首頁" title="到百度首頁"></a>

統計改頁面中的a標籤元素:

@Test
    public void test03() throws InterruptedException {

        System.setProperty("webdriver.chrome.driver", "/Users/nano/程式碼/Jessie/Driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, 10);
        driver.get("https://www.baidu.com/");
        wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("a")));
        List<WebElement> a = driver.findElements(By.tagName("a"));
        System.out.println(a.size());  //打印出a標籤的個數
    }

使用tagName方法來查詢元素,一般元素都是不止一個,可以結合findElements方法和type屬性來精準定位。

4.By.className()

測試頁面原始碼:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

使用className向輸入框中傳值

driver.findElement(By.className("s_ipt")).sendKeys("test1");

className屬性是利用元素的css樣式表所引用的偽類名稱來進行元素查詢的方法。

5.By.lintText()

測試頁面原始碼:

<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>

點選頁面中該元素:

driver.findElement(By.linkText("新聞")).click();

這個方法是通過頁面中的超文字連結中的文字來定位元素,這種方式一般用於定位頁面中的超文字連結。

6.By.partialLinkText()

測試頁面原始碼同5。

點選頁面中該元素

driver.findElement(By.partialLinkText("新")).click();
7.By.xpath(){}

測試頁面原始碼:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

向頁面中該元素輸入字元:

driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("test2");

Xpath的定位方式是一個非常強大的定位方式,可以定位頁面中幾乎所有的元素。Xpath是XML path的簡稱,HTML文件本身是一個標準的XML頁面,所以我們可以使用Xpath的語法來定位元素。不熟悉Xpath語法的人也完全不用擔心,Chrome、Firefox瀏覽器中都可以複製Xpath路徑,如下圖:

![](/Users/nano/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/430f4205b2f8e1e38df458da0597a83d/Message/MessageTemp/96624a0fe103ddac70b33c322d8ec48d/Image/30431515140633_.pic_hd.jpg)

在Firefox中還可以使用外掛firebug來查詢到xpath路徑。firebug複製出來的xpath路徑是絕對路徑,隨著產品迭代可能會經常需要去修改絕對路徑,所以推薦還是使用Chrome的相對路徑。

Xpath除了能夠精準定位,也支援模糊定位,可以用於原始碼中無標準元素或者元素標籤不是唯一時。模糊定位主要有3種定位方式

1)contains關鍵字

測試頁面原始碼:

<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>

點選頁面元素:

driver.findElement(By.xpath("//a[contains(@href, 'news')]")).click();

上面程式碼的含義是,在頁面中尋找href屬性值中包含“news”的所有a元素。@後面可以跟著尋找元素的任意屬性名。

2)start-with關鍵字

測試頁面原始碼同上:

點選頁面元素:

driver.findElement(By.xpath("//a[starts-with(@href, 'http://news')]")).click();

以上程式碼含義是,在頁面中尋找href屬性值中以“http://news”開頭的所有a元素。@後面可以跟著尋找元素的任意屬性名。

3)Text關鍵字
8.By.cssSelector()

測試頁面原始碼:

<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>

點選頁面元素:

driver.findElement(By.cssSelector("#u1 > a:nth-child(1)")).click();

cssSelector元素定位方式跟xpath類似,但執行速度較快,各種瀏覽器對它的支援都很到位,所以功能也比較強大。cssSelector的定位方式稍微有點複雜,需要進一步瞭解的可以自行Google一下。初學者可以使用右擊—copy—Copy selector的方式來快速得到cssSelector路徑。

![](/Users/nano/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/430f4205b2f8e1e38df458da0597a83d/Message/MessageTemp/9e20f478899dc29eb19741386f9343c8/Image/2581515169693_.pic_hd.jpg)

三、對於瀏覽器視窗的操作方式

在瀏覽器中有些操作是使用系統原生的確認框,這時就無法通過定位元素的方式來操作我們需要的步驟。這種情況就要去操作瀏覽器的視窗來實現。

1.彈出視窗為Confirm型別

選擇確認:

Alert al = driver.switchTo().alert();
al.accept();

選擇取消:

Alert al = driver.switchTo().alert();
al.dismiss();
2.彈出視窗為Alert型別
Alert al = driver.switchTo().alert();
al.accept();
3.放大瀏覽器視窗
driver.manage().window().maximize();
4.關閉瀏覽器視窗
driver.quit();
driver.close();
5.重新整理/前進/後退瀏覽器
driver.navigate().refresh();
driver.navigate().forward();
driver.navigate().back();

quit和close的區別在於,quit關閉整個瀏覽器的視窗;close關閉瀏覽器標籤頁。

四、其他可能遇到的操作

1.處理隱藏元素

在有些情況下,頁面中的元素會被隱藏,需要滑鼠點選或者懸停才能看到它隱藏的元素,這種情況下,需要對這些隱藏的元素做一些處理,使得我們可以任何情況下都能獲取這些元素。

 //處理隱藏元素的方法
        Actions action = new Actions(driver);
        WebElement nav = driver.findElement(By.xpath("//div[@id='appContentContainer']/div/div/div[1]/div[2]/div/div/button"));
        //判斷當nav元素出現時才執行相應的操作
        if (nav.isDisplayed()) {
            System.out.println("found it");
            action.moveToElement(nav).build().perform();
        }
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("document.getElementById('appContentContainer').style.display='block';");
        WebElement onElement1 = driver.findElement(By.xpath("(//ul[@class='dropdown-menu']/li)[last()]/a"));
        action.moveToElement(onElement1).click().build().perform();
2.程式等待方式

在使用selenium的過程中,等待web載入時,通常要等待下一個元素出現再進行操作,這個過程中需要用到等待。selenium中有3種等待:webDriverWait()、implicitly_wait()、sleep().

1)sleep():強制等待,設定固定的休眠時間。任何情況下都等待設定的時間。
//引入前匯入相應的包,單位為毫秒;
sleep(5);
2)implicitly_wait():隱式等待,等待一個元素被發現、命令完成,超出了設定的時間則跑出異常;
 //設定指令碼在查詢元素時的最大等待時間
 WebDriver driver = new ChromeDriver();
 driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
3)webDriverWait():顯示等待,明確要等待的元素在指定時間之內沒找到,那麼就丟擲Exception.
//設定等待的時長,最長10S
WebDriverWait wait = new WebDriverWait(driver, 10);  wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='appContentContainer']/div/div/div[1]/div[2]/div/div/button")));

先寫這些吧,後續可能會繼續增加~