本文總結了使用Selenium Web driver 做頁面自動化測試的一些 tips, tricks, snippets.
1. Chrome Driver 如何安裝 extensions
兩種方式
a) Packed (.crx file) -- crx為Chrome的插件后綴名,FireFox的是xpi
ChromeOptions options = new ChromeOptions(); options.addExtensions(new File("/path/to/extension.crx")); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); ChromeDriver driver = new ChromeDriver(capabilities);
b) Unpacked (directory)
ChromeOptions options = new ChromeOptions(); options.addArguments("load-extension=/path/to/extension"); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); ChromeDriver driver = new ChromeDriver(capabilities);
2. 使用自定義的profile (即 user data directory)
因為WebDriver每次啟動一個實例時,會生成一個匿名的profile, 如果想用自己的profile (包括extensions, 還有settings), 可以定義user data directory 路徑
ChromeOptions options = new ChromeOptions(); options.addArguments("user-data-dir=C:/Users/user_name/AppData/Local/Google/Chrome/User Data");
3. 最大化窗口
網上有很多方式但好多試了都不行,下面這個是可行的
ChromeOptions options = new ChromeOptions(); options.addArguments("start-maximized"); DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setCapability(ChromeOptions.CAPABILITY, options);
4. 擺脫Google Analytics
由於很多網頁嵌入Google Analytics, 這會導致Web Driver 訪問的時候超慢, 下載這個no_google_analytics-0.6-an+fx.xpi文件, FireFox的插件, Chrome的網上也有,參考這里。
FirefoxProfile profile = new FirefoxProfile(); profile.addExtension(new File(getClass().getClassLoader().getResource("no_google_analytics-0.6-an+fx.xpi").getFile())); desiredCapabilities.setCapability(FirefoxDriver.PROFILE, profile);
5. 設置代理
a) 不使用代理
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("network.proxy.type", 0); driver = new FirefoxDriver(firefoxProfile);
b) 手動配置代理 http
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("network.proxy.type", 1); firefoxProfile.setPreference("network.proxy.http", "10.51.1.140"); firefoxProfile.setPreference("network.proxy.http_port", "8080"); driver = new FirefoxDriver(firefoxProfile);
c) 自動代理配置
FirefoxProfile firefoxProfile = new FirefoxProfile(); profile.setPreference("network.proxy.type", 2); profile.setPreference("network.proxy.autoconfig_url", "http://proxy.xxx.net:8001"); //Auto config url driver = new FirefoxDriver(firefoxProfile);
##轉載注明出處:http://www.cnblogs.com/wade-xu/p/4846155.html
6. 禁用image, javascript, css, document
firefoxProfile.setPreference("permissions.default.image", 2); firefoxProfile.setPreference("permissions.default.script", 2); firefoxProfile.setPreference("permissions.default.stylesheet", 2); firefoxProfile.setPreference("permissions.default.subdocument", 2);
7. 上傳文件
String filePath = "path\\to\\file\for\\upload"; JavascriptExecutor jsx = (JavascriptExecutor) driver; jsx.executeScript("document.getElementById('fileName').value='" + filePath + "';");
8. Frame切換
WebElement frameElement = driver.findElement(By.id("id-of-frame"));
driver.switchTo().frame(frameElement);
9. Get page source
String content = driver.getPageSource();
10. Get 頁面元素的 HTML source
JavascriptExecutor jsx = (JavascriptExecutor) driver; String elementId = "element-id"; String html =(String) jsx.executeScript("return document.getElementById('" + elementId + "').innerHTML;");
##轉載注明出處:http://www.cnblogs.com/wade-xu/p/4846155.html
11. Scroll Up, Down
JavascriptExecutor jsx = (JavascriptExecutor) driver; //Vertical scroll - down by 100 pixels jsx.executeScript("window.scrollBy(0,100)", ""); //Vertical scroll - up by 55 pixels (note the number is minus 55) jsx.executeScript("window.scrollBy(0,-55)", "");
也可以左右scroll
12. 多層菜單的處理
Actions actions = new Actions(driver); WebElement menuElement = driver.findElement(By.id("menu-element-id")); actions.moveToElement(menuElement).moveToElement(subMenuElement).click();
有些情況下,move到一級菜單 需要等待一會兒 才能定位到子菜單里的選項,可以thread sleep一會兒
actions.moveToElement(menuElement); Thread.sleep(1); actions.moveToElement(subMenuElement); Thread.sleep(1); actions.moveToElement(subSubMenuElement).click().perform();
13. 提取元素的 CSS 屬性
背景色, 文字顏色, 文字字號
String bgcolor = driver.findElement(By.id("id123")).getCssValue("background-color"); String textColor = driver.findElement(By.id("id123")).getCssValue("color");
String textFont = dr.findElement(By.tagName("h3")).getCssValue("font")
14. 非常特殊的一個輸入框
鼠標需要一直按在上面才可定位到該元素,不然元素隱藏着,解決辦法用Action, moveToElement然后Click 輸入鍵盤動作Ctrl+A (全選)然后輸入數據,最后perform(), 全選輸入是為了清除原來的數據
action.moveToElement(textSpan).click().sendKeys(Keys.chord(Keys.CONTROL, "a")).sendKeys(input).perform();
15. 執行JS命令直接Click button
有時候Button元素在頁面底部,屏幕只能顯示頁面上班部分, click不到元素, 這種方式任何時候都可行。
((JavascriptExecutor)webDriver).executeScript("arguments[0].click();", webElement);
##轉載注明出處:http://www.cnblogs.com/wade-xu/p/4846155.html
16. 取得頁面上所有的link
比如 html 如下
<div class="cities_boxer"> <div class="left_side"> <dl> <dt>A</dt> <dd> <a href="http://anshan.anjuke.com" class="">鞍山</a> <a href="http://anyang.anjuke.com" class="">安陽</a> <a href="http://anqing.anjuke.com" class="">安慶</a> </dd> </dl> </div> </div>
String link = null; List<WebElement> ls = driver.findElements(By.tagName("a")); List<String> links = new ArrayList<String>(); for (WebElement a : ls) { link = a.getAttribute("href"); links.add(link); }
17. 查找最后一個子節點
比如瀏覽器F12 控制台輸入
$$('.cities_boxer > div.left_side > dl:nth-child(1) > dd > a:nth-last-child(1)')
返回 <a href="http://anshun.anjuke.com" class="">安順</a>
注: $$() Returns an array of all the elements that match the specified CSS selector.
另一種方式
$x("//*[@id='content']/div[4]/div[1]/dl[1]/dd/a[last()]")
注:$x() Returns an array of elements that match the specified XPath.
測試站點:http://www.anjuke.com/sy-city.html
18. 等待 FluentWait
wait = new FluentWait<WebDriver>(webDriver).withTimeout(10, TimeUnit.SECONDS) .pollingEvery(1, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
In FluentWait you have more options to configure apart from Maximum wait time like polling interval, exceptions to ignore etc.
19. Take A Screenshot
File screenshot =((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
20. WebDriverWait 等待元素的預期狀態
public void waitUntilBecomesVisible(WebElement webElement) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.visibilityOf(webElement)); }
public void waitTextToBePresentInElement(WebElement element, String text) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.textToBePresentInElement(element, text)); }
public void waitUntilInvisible(By by) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.invisibilityOfElementLocated(by)); }
public void WaitUntilClickable(WebElement element) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.elementToBeClickable(element)); }
21. 隱性等待
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
22. AjaxElementLocatorFactory
public class PageBase { public PageBase(WebDriver driver) { AjaxElementLocatorFactory finder = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(finder, this); } }
注: 常用於Web application 有很多Ajax組件元素
Selenium does comes with AjaxElementLocatorFactory, which creates instances of AjaxElementLocator. Now the idea is, if you send an Ajax request, this ElementLocator waits for 250 milliseconds to look for the element, till it ultimately times out (configurable). The only exposed API from Selenium, that I found, was PageFactory, whose main purpose is to create a DefaultElementLocatorFactory, which does not wait.
23. 彈出對話框
Alert alert = driver.switchTo().alert();
alert.accept();
alert.dismiss();
alert.getText();
24. 拖拉(Drag andDrop)
WebElement element =driver.findElement(By.name("source")); WebElement target = driver.findElement(By.name("target")); (new Actions(driver)).dragAndDrop(element, target).perform();
25. WebDriver設置元素焦點
if("input".equals(element.getTagName()){ element.sendKeys(""); } else{ new Actions(driver).moveToElement(element).perform(); }
或
((JavascriptExecutor)webDriver).executeScript("document.getElementById('elementid').focus();");
##轉載注明出處:http://www.cnblogs.com/wade-xu/p/4846155.html
26. 瀏覽器 Navigate Back And Forward
//Go back to the last visited page driver.navigate().back(); //go forward to the next page driver.navigate().forward();
27. Check If An Element Exists
driver.findElements(By.id("element-id")).size()!=0
28. Check If An Element Is Visible
WebElement element = driver.findElement(By.id("element-id")); if(element instanceof RenderedWebElement) { System.out.println("Element visible"); } else { System.out.println("Element Not visible"); }
感謝閱讀,如果您覺得本文的內容對您的學習有所幫助,您可以點擊右下方的推薦按鈕,您的鼓勵是我創作的動力。
##轉載注明出處:http://www.cnblogs.com/wade-xu/p/4846155.html