25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation


本文總結了使用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 等待元素的預期狀態

明確的等待是指在代碼進行下一步操作之前等待某一個條件的發生。最不好的情況是使用Thread.sleep()去設置一段確認的時間去等待。
為什么說最不好呢?因為一個元素的加載時間有長有短,你在設置sleep的時間之前要自己把握長短,太短容易超時,太長浪費時間。
selenium webdriver提供了一些方法幫助我們等待正好需要等待的時間。利用WebDriverWait類和ExpectedCondition接口就能實現這一點。
    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查詢Dom一定時間。默認值是0, 但是設置之后,這個時間將在WebDriver對象實例整個生命周期都起作用。
 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();
getText()    得到它的文本值
accept()      相當於點擊它的"確認"
dismiss()     相當於點擊"取消"或者叉掉對話框
 

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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM