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每次启动一个Firefox的实例时,会生成一个匿名的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 confi 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()]")

注: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));
    }

##转载注明出处:http://www.cnblogs.com/wade-xu/p/4846155.html

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

时间: 2024-10-14 07:42:56

25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation的相关文章

selenium web driver 实现截图功能【转】

在验证某些关键步骤时,需要截个图来记录一下当时的情况 Webdriver截图时,需要引入 import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; 截图方法 public static void snapshot(

Selenium web driver对于三大浏览器的版本支持总结

Selenium没有传说中的兼容三大浏览器,  在驱动浏览器执行自动化测试的时候还是有一些问题的.  尤其是driver和Selenium版本不一致,他们各自支持的浏览器版本不一样. chromedriver 对于chrome浏览器的支持    2.3版本的driver支持到chrome 30. chromedriver2.9版本 支持至少31以上的, 向下不兼容.如chrome29   会报错最低支持31以上的chrome IEDriverServer.exe 支持到IE8,IE9  不支持I

自动化测试由浅入深--基础篇之Selenium RC和web Driver实现原理

今天开始写自动化的东西,以后可能会穿插其他的东西,这样为了符合处于各个阶段的测试爱好者.今天笔者就开始讲自动化测试相关的东西了.今天先讲原理. Selenium RC实现原理,我先在网络上找了一个图,如下所示: 大家可以清晰的看到,简单来说,就是我们先用编程语言,写好控制程序,然后通过Remote Control Server 去控制浏览器,按照自己写好的程序去执行.大家也可以看到,selenium支持很多语言,java,Ruby,Python,PHP等,你可以选择你喜欢的任何语言. 下面我们看

Selenium Web 自动化 - 如何找到元素

Selenium Web 自动化 - 如何找到元素 2016-07-29 1. 什么是元素? 元素:http://www.w3school.com.cn/html/html_elements.asp 2. 定位方式解析 Selenium WebDriver 提供一个先进的技术来定位 web 页面元素.Selenium 功能丰富的API 提供了多个定位策略如:Name.ID.CSS 选择器.XPath 等等,如下图所示: 一般会用ID来定位,因为它是唯一的,xpath也比较通用,火狐浏览器插件:f

Selenium Web 自动化 - Selenium常用API

Selenium Web 自动化 - Selenium常用API 2016-08-01 1 WebElement相关方法2 iFrame的处理3 操作下拉选择框4 处理Alert5 处理浏览器弹出的新窗口6 执行JS脚本7 等待元素加载8 模拟键盘操作9 设置浏览器窗口大小10 上传文件11 Selenium处理HTML5 1 WebElement相关方法 Method   Summary void clear() If   this element is a text entry elemen

Selenium Web 自动化 - Selenium(Java)环境搭建

Selenium Web 自动化 - Selenium(Java)环境搭建 2016-07-29 第1章 Selenium环境搭建 1.1 下载JDK JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1.2 安装和配置JDK 安装目录尽量不要有空格  D:\Java\jdk1.8.0_91; D:\Java\jre8 设置环境变量: “我的电脑”->右键->“

Selenium - Web自动化测试的基本操作实现

Selenium - Web自动化测试的基本操作实现 摘自https://www.jianshu.com/p/0d5cc5503f91 摘要:  之前用Selenium做UI自动化测试从初学到熟练碰到过很多问题,这里就不一一细说了,所以把最基本的操作都写在了一起,包括:控制浏览器,操作元素,鼠标事件,键盘事件,设置元素等待,多表单/窗口切换,警告框处理,上传文件,操作Cookie,调用JavaScript控制浏览器滚动条,窗口截图. 时间紧急,没有仔细整理,望读者见谅~~ 目录 1.控制浏览器

Code Snippets

发现SSMS的Tools菜单中有一个Code Snippets Manager,Code Snippets 是预先写好的代码段,只需要在Query Editor 的context 中,右击弹出快捷菜单,然后点击Insert Snippet,就能选择需要的Code Snippets,添加到Query Editor中. Step1,右击,点击 Insert Snippet Step2, 选择需要创建的Object Type Step3,选择Index 这就是 Create Index Basic 的

Code Snippets懒人输入

在做项目开发的过程中,实际上是比较麻烦的,因为相同内容,我们需要书写多次,无形中给我们的开发增加了工作量.那么有什么办法可以避免这样重复的工作量吗?这就是这里要说的Code Snippets Library. 在项目开发中,我们经常可以看到如下所示的代码: @property (nonatomic, copy) NSString *isbatchapprove; @property (nonatomic, copy) NSString *currentResult; @property (non