你也可以在Frame之間切換(或者進(jìn)入Frame):
driver.switchTo().frame("frameName");
你還可以根據(jù)路徑使用Frame的子Frame,而且可以通過(guò)索引定位Frame。
driver.switchTo().frame("frameName.0.child");
以上方法將切換到名稱為“frameName”的Frame的第一個(gè)子Frame,所有Frame都是Web頁(yè)面的頂端開(kāi)始計(jì)數(shù)。
7.5彈出框
Selenium2.0 beta1版本,我們提供方法獲取彈出框。在你觸發(fā)彈出框的操作后,你可以用一下方法進(jìn)入彈出框:
Alert alert = driver.switchTo().alert();
以上方法將會(huì)返回當(dāng)前當(dāng)前打開(kāi)的alert對(duì)象,你可以對(duì)這個(gè)對(duì)象進(jìn)行任何可操作:點(diǎn)擊取消,點(diǎn)擊確定,關(guān)閉窗口,獲取alert的文本內(nèi)容等。這個(gè)接口在alerts、confirms、prompts對(duì)象上都有很好的應(yīng)用,具體請(qǐng)參見(jiàn)API文檔。
7.6Navigation:瀏覽器本地歷史記錄
前文中,我們使用get方法來(lái)獲取網(wǎng)頁(yè)(driver.get("http://www.example.com"))。正如你看到的,WebDriver有不少輕量級(jí)的功能聚焦的接口,Navigation是這樣一個(gè)。正因?yàn)榧虞d網(wǎng)頁(yè)是一個(gè)再普通不過(guò)的需求,這個(gè)方法存在于Driver類下面,但是用法很簡(jiǎn)單:
driver.navigate().to("http://www.example.com");
重申一下,"navigate().to()"和"get()"做的是同樣的事情,只不過(guò)其中一個(gè)更適合打印。
Navigate接口還提供方法可以在瀏覽器歷史記錄中前后翻頁(yè)。
driver.navigate().forward();
driver.navigate().back();
請(qǐng)注意,以上功能完全取決于底層的瀏覽器。如果你習(xí)慣跨瀏覽器操作,當(dāng)你使用這些接口時(shí)可能會(huì)出現(xiàn)意想不到的的異常。
7.7Cookies
在我們開(kāi)始下一步的講解之前,你可能對(duì)WebDriver如何操作本地Cookies很感興趣。首先,你必須處于當(dāng)前Cookie的作用域。如果你在打開(kāi)一個(gè)網(wǎng)頁(yè)之前嘗試預(yù)置Cookie,而且你的主頁(yè)大到需要很長(zhǎng)一段時(shí)間來(lái)加載,這時(shí)候你需要找一個(gè)小點(diǎn)的網(wǎng)頁(yè)來(lái)替代,比如HTTP 404網(wǎng)頁(yè)(http://example.com/some404page)。
// 打開(kāi)Cookie作用的網(wǎng)站
driver.get("http://www.example.com");
// 設(shè)置全局Cookie
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);
// 輸出當(dāng)前網(wǎng)頁(yè)所有可用的Cookie
Set allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}
// 你又三種方法刪除Cookie
// By name
driver.manage().deleteCookieNamed("CookieName");
// By Cookie
driver.manage().deleteCookie(loadedCookie);
// Or all of them
driver.manage().deleteAllCookies();
7.8 修改用戶代理服務(wù)器
對(duì)于FireFox來(lái)說(shuō)很簡(jiǎn)單:
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);
7.9 拖拽Web元素
下面是一個(gè)拖拽Web頁(yè)面元素的例子,前提是本地事件必須可用。
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
8 各種Driver的特性以及如何選擇合適Driver
翻譯中
9 向前兼容:融合WebDriver和Selenium-RC
翻譯中
10 為遠(yuǎn)程WebDriver單獨(dú)啟動(dòng)Selenium Server
翻譯中
譯者注:
1、原文鏈接:http://www.seleniumhq.org/docs/03_webdriver.jsp。
2、文中只包含了java相關(guān)的操作,WebDriver還支持c#/Python/Ruby/Perl/PHP/Perl,如有需要,請(qǐng)閱讀原文。
3、language binding,又叫g(shù)lue code,意思是膠水代碼,比如有個(gè)C++的lib庫(kù),java調(diào)用這個(gè)庫(kù)的api叫java binding。參考:http://en.wikipedia.org/wiki/Language_binding。
4、措辭拙劣,有些單詞句子沒(méi)有深究直譯了,深感從閱讀到翻譯差的不僅僅是一本字典,還有文化的差異。筆者強(qiáng)烈推薦直接閱讀官網(wǎng)上的原文,如果我的譯文給你造成誤解,深感不安。這也是后三章不敢繼續(xù)班門(mén)弄斧的原因,等我對(duì)Selenium熟悉了之后再回來(lái)補(bǔ)全。