掌握selenium初級(jí)用法后,來(lái)繼續(xù)深入學(xué)習(xí)。
選擇合適的WebDrvier
WebDriver是一個(gè)接口,它有幾種實(shí)現(xiàn),分別是HtmlUnitDrvier、FirefoxDriver、InternetExplorerDriver、ChromeDriver、OperaDriver,除了 InternetExplorerDriver只能在Windows平臺(tái)運(yùn)行,其他WebDriver均能跨平臺(tái)。
如果追求運(yùn)行速度,HtmlUnitDriver是,但是它沒(méi)有運(yùn)行界面,不能實(shí)時(shí)看到運(yùn)行效果。如果想看到運(yùn)行效果,可以使用FirefoxDrvier,它會(huì)真正打開(kāi)瀏覽器,在屏幕上運(yùn)行,因此我們可以監(jiān)測(cè)頁(yè)面元素的位置、CSS的值等,但是代價(jià)是速度慢。
這里為了簡(jiǎn)單,使用 HtmlUnitDriver.
<code>WebDriver driver = new HtmlUnitDriver();</code>
導(dǎo)航
有了WebDriver實(shí)例,第一件事情是打開(kāi)頁(yè)面。一般的做法是調(diào)用get方法:
<code>driver.get("http://www.yeetrack.com");</code>
WebDriver會(huì)一直等待,直到頁(yè)面加載完畢(也是”onload”方法釋放)。
和頁(yè)面進(jìn)行交互
僅僅打開(kāi)頁(yè)面還不夠,我們需要的是在頁(yè)面上進(jìn)行操作,進(jìn)一步講是要操作頁(yè)面中的html元素,如:
<code><input type="text" name="passwd" id="passwd-id" /></code>
要操作頁(yè)面元素,首先要定位元素,可以通過(guò)多種方法定位,如下:
<code>WebElement element;
element = driver.findElement(By.id("passwd-id"));
element = driver.findElement(By.name("passwd"));
element = driver.findElement(By.xpath("//input[@id='passwd-id']"));</code>
定位元素時(shí),有兩點(diǎn)要注意。通過(guò)text的值來(lái)定位一個(gè)Link時(shí),text必須精確匹配;通過(guò)xpath來(lái)定位元素時(shí),如果匹配到多條,只會(huì)返回第一條結(jié)果,如果沒(méi)有匹配到,會(huì)拋NoSuchElementException異常。
WebDriver擁有”Object-baseed” API,我們可以使用WebElement來(lái)表示所有的頁(yè)面元素。WebElement類有很多操作元素的方法,但是有些方法可能對(duì)當(dāng)前元素?zé)o效,不用擔(dān) 心,WebDriver會(huì)盡力幫我們處理。如,對(duì)一個(gè)”meta”標(biāo)簽元素,我們調(diào)用了WebElement的”SetSelected()”方 法,WebDriver會(huì)拋出異常。
我們定位到一個(gè)Element,接下來(lái),我們可能要進(jìn)行一些操作,如想鍵入一些字符:
<code>element.sendKeys("sone text");</code>
當(dāng)然,我們也可以通過(guò)”Keys”這個(gè)類,來(lái)模擬鍵盤輸入:
<code>element.sendKeys(" and some", Keys.ARROW_DOWN);</code>
記住,我們向這些元素輸入的字符串,它們不會(huì)自動(dòng)清空,也是說(shuō)調(diào)用”sendKeys()”方法,是向元素中追加字符串。如果要清空一個(gè)input標(biāo)簽或者textarea:
<code>element.clear();</code>
填寫表單
已經(jīng)知道了如何鍵入字符串,那么其他元素呢?如checkboxes,如何選中;”OPTION”標(biāo)簽,如何設(shè)置”setSelected()”。下面是處理Select標(biāo)簽的例子:
<code>WebElement select = driver.findElement(By.xpath("//select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for(WebElement option : allOptions)
{
System.out.println(String.format("Value is " %s, option.getAttribute("value")));
option.click();
}</code>
上面的代碼,首先定位一個(gè)Select元素,然后獲取它下面的所有option,并且打印出來(lái),執(zhí)行一個(gè)click操作。明顯,如果想選中某個(gè)選 中,這種方法不是佳選擇。其實(shí)WebDrvier定義了Select類,它提供一些更快捷的方式, 如”selectByIndex()”、”selectByValue()”。
表單填寫完畢,然后是提交,我們可以通過(guò)點(diǎn)擊提交按鈕,進(jìn)行提交。
<code>driver.findElement(By.id("submit")).click();</code>
或者,WebElement提供”submit()”這個(gè)方法,如果當(dāng)前元素處在form表單中,調(diào)用該元素的submit方法,WebDriver會(huì)自動(dòng)提交這個(gè)表單;如果不處于form表單中,會(huì)拋出”NoSuchElementException”異常。
<code>element.submit();</code>