Selenium2 WebDriver入门

Selenium“定制“谷歌浏览器—ChromeOptions类的使用(Java语言) 目录一、源码-ChromeOptions类的方法二、常用设置2.1 设置浏览器文件默认下载路径2.2 无头模式(后台运行)2.3 启动最大化2.4 设置中文简体2.5 关闭GPU2.6其他设置 一、源码-ChromeOptions类的方法     通过查看ChromeOptions类的源码,我们可以看到ChromeOptions类有下面这些方法。 merg... 阅读详情

1      简介

资源

jar包:http://code.google.com/p/selenium/downloads/list or http://selenium-release.storage.googleapis.com/index.html 

官方 UserGuide:http://seleniumhq.org/docs/

2      基本配置

2.1      Firefox

对于不同的浏览器,需要创建不同类型的WebDriver进行测试,默认情况下我们通常可以直接 new XXXDriver() 来创建对应类型的 WebDriver。

如果使用Firefox测试,而Firefox又没有安装在默认目录下,那么直接 new FirefoxDriver()将会出现异常提示找不到浏览器。这时,我们需要在程序开始调用以下代码,用以指定Firefox的位置:

System.setProperty(“webdriver.firefox.bin”, “***\\firefox.exe”)

或者我们使用 FirefoxBinary 实例来指定浏览器的位置:

File firefox = new File(“…\\firefox.exe”);

FirefoxBinary firefoxbin = new FirefoxBinary(firefox);

WebDriver driver = new FirefoxDriver(firefoxbin, null);

       值得注意的是,使用以上两种配置启动的Firefox浏览器是“全新”的,也就是说浏览器的设置都是初始的,包括插件集。这会使依赖 Firebug 等插件的开发调试工作无法进行,于是我们需要保留浏览器的配置信息。

这需要使用FirefoxProfile 实例来指定配置文件的位置:

                   String path = System.getProperty( "user.home" )

                                     + "\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\";

                   File prodir = new File( path );

                   File[] files = prodir.listFiles( new FilenameFilter()

                   {

                            @Override

                            public boolean accept( File dir, String name )

                            {

                                     return name.endsWith( ".default" );

                            }

                   } );

                   FirefoxProfile profile = new FirefoxProfile( files[0] );

       综上而言,我们通常会使用 FirefoxDriver(FirefoxBinarybinary, FirefoxProfile profile) 形式的构造器。

 

2.2      Chrome

与Firefox类似,如果测试程序找不到Chrome的安装位置(非默认位置),那么可以这样指定:

System.setProperty(“webdriver.chrome.driver”, “***\\chrome.exe”)

但是,使用Chrome测试,比较特别的是,需要驱动程序:

http://chromedriver.storage.googleapis.com/index.html

通常,我们使用 ChromeDriver(ChromeDriverServiceservice, ChromeOptions options) 形式的构造器,前一参数可指定驱动程序的位置,后一参数可指定浏览器的位置。

ChromeDriverService 实例的创建如下:

String chromeDriver = "…\\chromedriver.exe";

ChromeDriverService service = new ChromeDriverService.Builder().

                  usingDriverExecutable( new File(chromeDriver) ).build();

ChromeOptions 实例的创建如下:

String chrome = "…\\chrome.exe";

ChromeOptions options = new ChromeOptions();

options.setBinary( chrome );

 

3      基本使用

3.1      打开浏览器

开始测试前,总是应该创建一个WebDriver接口实现类实例,以打开某种浏览器。

// 创建Firefox driver实例,打开Firefox

WebDriver driver = new FirefoxDriver();

// 创建IE driver实例,打开IE

WebDriver driver = new InternetExplorerDriver();

3.2      打开测试页面

打开浏览器后,应该导航到测试页面进行测试。

driver.get( "http://www.baidu.com" )

另一种可选方式是:

driver.navigate().to( "http://www.baidu.com" );

3.3      查找元素

导航到测试页面后,就应该要查找页面元素进行操作了。

由于Selenium2推崇面向接口编程,所以所有元素都使用WebElement接口代表。

定位元素位置可以在WebDriver实例上进行,也可以在某个WebElement上进行。它们都暴露了findElement()和findElements()方法,前者查找返回一个WebElement对象否则抛出异常;后者查找返回一个WebElement列表,如果没有匹配项列表可能为空。

两种find方法都使用By类实例进行定位。By是一个抽象类,所以实际使用的应是它的派生子类,每种派生子类都代表一种查找策略。通常我们不直接调用其派生子类的构造器创建对象,而是使用By类的静态工厂方法来创建。

下面逐一说明各种定位方式。

3.3.1       By ID

通过ID查找。这是最高效也最常用的定位方式。但是,可能存在的陷阱是:网页中ID并非唯一或者ID是自动生成的。使用中应该避免这些情况。

WebElement element = driver.findElement(By.id("coolestWidgetEvah"));

3.3.2       By Name

通过name查找。

WebElement cheese = driver.findElement(By.name("cheese"));

3.3.3       By XPath

通过XPath查找。WebDriver试图在任何地方使用浏览器原生XPath能力,但是对于原生不支持XPath的浏览器,将提供实现。这可能导致一些非预期的行为,除非你清楚不同XPath引擎间的差异。

Driver

Tag and Attribute Name

Attribute Values

Native XPath Support

HtmlUnit Driver

Lower-cased

As they appear in the HTML

Yes

Internet Explorer Driver

Lower-cased

As they appear in the HTML

No

Firefox Driver

Case insensitive

As they appear in the HTML

Yes

比如如下页面:

<input type="text" name="example" />

<INPUT type="text" name="other" />

查找语句为:

List<WebElement> inputs = driver.findElements(By.xpath("//input"));

匹配结果为:

XPath expression

HtmlUnit Driver

Firefox Driver

Internet Explorer Driver

//input

1 (“example”)

2

2

//INPUT

0

2

0

有时元素不必声明某些有默认值的属性,比如input元素的type属性可以缺省,缺省值为text。但是在WebDriver中使用XPath时,你不能期望能够匹配未声明的默认属性。

3.3.4       By Class Name

通过class属性查找。实际使用中相同的class属性一般对应多个元素,所以一般会查找到多个元素,然后取用第一个元素。

List<WebElement> cheeses = driver.findElements(By.className("cheese"));

3.3.5       By Link Text

通过超链接文本查找超链接。

WebElement cheese = driver.findElement(By.linkText("cheese"));

3.3.6       By Partial Link Text

通过部分超链接文本查找超链接。

WebElement cheese = driver.findElement(By.partialLinkText("cheese"));

3.3.7       By Css Selector

通过Css Selector查找。如果浏览器默认原生支持css查询,可参阅w3c css selectors;否则Sizzle被使用。IE6,7和FF3.0都使用Sizzle作为css查询引擎。

注意并非所有的浏览器都是等效的,有的css在一个中起作用也许在另一个中不会。

WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));

3.3.8       By TagName

通过元素标签名查找。

WebElement frame = driver.findElement(By.tagName("iframe"));

3.4      界面操作

找到页面元素后,需要操作元素,通常WebElement接口方法就足以操作大多数元素了。

3.4.1       通用操作

// 点击

element.click();

// 文本框输入

element.sendKeys(“*****”);

// 文本框清空

element.clear();

// 是否选中,单/多选等

element.isSelected();

// 是否可用

element.isEnabled();

3.4.2       文件域

file.sendKeys(filePath);

3.4.3       下拉列表

对于下拉列表这种较复杂的元素,使用通用的方法来操作将不是那么高效的。我们可以将其封装为Select对象,这将提供更多有用的方法便于操作。

Select select = new Select(driver.findElement(By.tagName("select")));

select.selectByVisibleText(“***”);

select.deselectByVisibleText(“***”);

select.selectByValue(“***”);

select.deselectByValue(“***”);

select.deselectAll();

select.getAllSelectedOptions();

select.getFirstSelectedOption();

3.4.4       表单

一旦填写完表单,我们就期望提交它。一个提交的方法是找到“提交”按钮并点击它。

driver.findElement(By.id("submit")).click();

另外,WebDriver为每个元素都提供了一个方便的submit()方法。如果你调用一个处于表单中的元素的submit()方法,WebDriver将沿DOM向上查找直到找到表单然后提交。如果元素不在表单中,则会抛出NoSuchElementException异常。

// 表单提交

element.submit();

3.4.5       Actions

// 拖拽元素到目标元素中

new Actions( driver ).dragAndDrop( element, target ).perform();

// hover

new Actions(driver).moveToElement( text ).perform();

3.4.6       对话框

我们可以获取到各种弹出对话框的对象,并可以执行accept、dismiss、读取内容或者向prompt中输入内容等操作。

Alert alert = driver.switchTo().alert();

alert.accept();

alert.dismiss();

alert.getText();

alert. sendKeys();

3.4.7       Windows和Frames切换

有的Web应用是多框架或多窗口的。

WebDriver支持在命名窗口间切换:

driver.switchTo().window("windowName");

怎样知道窗口的名字呢?查看一下打开它的JS或超链接:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

另外,也可以使用窗口句柄,这可能需要迭代所有窗口句柄来获取某个窗口的句柄了:

for (String handle : driver.getWindowHandles()) {

    driver.switchTo().window(handle);

}

在框架间切换也是类似的:

driver.switchTo().frame("frameName");

3.4.8       导航

driver.navigate().forward();

driver.navigate().back();

 

4      非界面操作

4.1      Cookie

driver.manage().addCookie(cookie);

driver.manage().getCookies();

driver.manage().getCookieNamed(“cookieName”);

driver.manage().deleteCookieNamed(“cookieName”);

driver.manage().deleteCookie(cookie);

driver.manage().deleteAllCookies();

4.2      执行JS

可以执行任意JS脚本来查找一个元素,并且只要返回一个DOM元素,它将被自动转换为WebElement对象。

WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");

 

4.3      截图

测试过程中,可以把页面截图,保存成为图片。

需要注意,截取的图片存在临时目录,所以需要将其拷贝到指定的目录,否则测试完成可就找不到截图了。

File screenshotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

FileUtils.copyFile( screenshotFile, new File("E:\\1.png") );

或远程截图

WebDriver augmentedDriver = new Augmenter().augment(getDriver());

File screenshotFile = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE);

 

4.4      等待

当页面需要一段时间才能加载完成,那么就需要等待完成后才进行查找和操作。

等待有2种:显性等待和隐性等待。

显性等待使用WebDriverWait类和ExpectedCondition接口完成,编码实现ExpectedCondition接口用以判断某种条件,然后等待这种条件达成或超时。

WebElement myDynamicElement = (new WebDriverWait(driver, 10))

  .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

ExpectedConditions类提供了许多静态工厂方法,返回常用的ExpectedCondition对象。

隐性等待更为简洁:

driver.manage().timeouts().implicitlyWait( 10, TimeUnit.SECONDS );

但是隐性等待的设置将影响后续全局的查找操作。

4.5      改变User Agent

FirefoxProfile profile = new FirefoxProfile();

profile.addAdditionalPreference("general.useragent.override", "some UA string");

WebDriver driver = new FirefoxDriver(profile);

 

5      附录

5.1      注意

5.1.1       关于click()

当调用WebElement.click()时,如果被操作元素是不可用的(disabled),click()方法调用仍会是正常的,不会有异常。

所以,如果会出现被点击的元素是不可用的情况,而点击不可用元素又被认为是非法的,那么应该在click()调用前使用isEnable()方法检查元素可用性。

5.1.2       driver.close() vs.driver.quit()

在测试结束后通常需要关闭浏览器,这个操作通常使用close()或quit()方法完成。但是两者是有区别的,其方法说明也体现了这一点。

close()

Close the current window, quitting the browser if it's the last window currently open.

quit()

Quits this driver, closing every associated window.

对于close()而言,如果当前窗口是最后一个打开窗口,那么关闭当前窗口退出浏览器;quit()则关闭每个关联的窗口退出浏览器。

但是,实际使用中close()方法的行为同说明有一些出入。以firefox为例,当当前窗口为最后一个打开窗口时,close()方法不会将最后一个窗口关闭,当然也不会使firefox退出。

5.2      常用API

5.2.1       Sleeper

原生休眠类

org.openqa.selenium.browserlaunchers.Sleeper

public static void sleepTightInSeconds(longtimeoutInSeconds)

public static void sleepTight(long timeout)

 

selenium2初学者快速入门 selenium入门数据,测试人员必备 立即下载

相关推荐

selenium2从入门到精通

selenium2从入门到精通书籍,提供selenium初学者学习的基础知识。

Selenium安装配置ChromeDriver过程中的一些问题

使用 Selenium 和 Chrome WebDriver 进行自动化测试时,需要注意一些关键的配置和环境设置问题以确保一切顺利进行。

TradingAgents-CN专栏 1977

保姆级教程:手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动

本文提供了一份详细的保姆级教程,手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动。从基础配置到RGMII接口的特殊设置,再到驱动开发的关键步骤和调试技巧,帮助开发者快速掌握PHY芯片的移植与开发。

weixin_33734785的博客 333

selenium2读书笔记(二)启动Chrome

前一篇文章里面写的是用driver打开本地的Chrome, 在一个项目中,大家本地的Chrome可能版本不一定相同,所以最好用diver打开同一个Chrome,这个Chrome可以放在工程里面。下面是具体的代码:public class TestCaseBase { private void setUpChrome() throws Exception{ File fileFor

u013840366的专栏 486

OpenEuler22.04 快速部署Docker:华为云镜像源配置指南

本文详细介绍了在OpenEuler 22.04系统上快速部署Docker的完整流程。针对系统默认源版本老旧的问题,重点讲解了如何配置华为云镜像源以加速安装,并涵盖Docker引擎、Docker Compose的安装、服务启动验证、权限配置、镜像加速等核心步骤与常见问题排查,帮助用户高效搭建稳定的容器化开发环境。

http9protocoller的博客 174

WSL2双显卡配置实战:避开Tesla与TCC模式的那些坑

本文针对WSL2环境下无法识别Tesla计算卡的问题进行深度解析。核心原因在于WSL2目前仅支持WDDM模式的显卡,而Tesla系列及运行在TCC模式下的显卡因采用纯计算架构而无法兼容。文章提供了详细的排查步骤,并给出了包括调整显卡用途、使用虚拟机或物理机在内的多种实用解决方案,帮助开发者避开配置陷阱。

weixin_29289821的博客 539

Selenium之cannot find Chrome binary错误

当我们需要创建驱动对象打开浏览器,这个时候就需要需要告诉 Chrome 的位置(路径),也就是我们要创建几次驱动对象,就要多写几次 Chrome路径 的代码,只需要创建一次的话其实就多写两行代码。我需要告诉它我的 Chrome 所在位置(不告诉的话它会以为我的 Chrome 默认在 C盘)温馨提示:还是默认C盘不会出问题啊!,运行错误:还是未找到 Chrome。

weixin_53966941的博客 1379

计算机网络实验六 RIP 配置实验

Man! What can I say?

AClerk的博客 1592

Selenium2.0 WebDriver入门指南

1.1下载selenium2.0的lib包 http://code.google.com/p/selenium/downloads/list 官方User Guide:http://seleniumhq.org/docs/ 1.2用webdriver打开一个浏览器 我们常用的浏...

chengqinjian6893的博客 181

读书笔记 | 财务会计理论(第7版 William R.Scott)(中):契约视角下的会计信息价值

本文从契约理论视角深入剖析了财务会计信息的核心价值。文章指出,会计信息作为关键的“契约润滑剂”,通过债务合同与薪酬合同等具体形式,有效解决了公司内外的信息不对称与道德风险问题,协调了股东、债权人及管理层等多方利益,是公司治理与资本市场有效运转的基石。

mac99的博客 330

2025最新聚合易支付官方完整版 – 全开源

2025聚合易支付5.0全开源版引领下一代智能支付革命,以"开放·智能·可信"为核心理念,成为全球首个通过量子安全认证的开源支付系统。该系统具备三大突破性创新:AI原生风控架构、跨链支付协议和零信任安全体系,支持百万级TPS处理能力。技术亮点包括Rust异步框架、Llama3风控模型、Polkadot跨链方案及IPFS分布式存储。提供量子安全支付、智能路由、元宇宙支付等六大功能,并通过开放原子基金会认证,构建了包含1200+全球开发者的开源生态。

meng1325200的博客 784

Python2+Selenium入门04-关于WebDriver类

WebDriver 和 WebElement 是 Selenium 中两个非常重要的类,使用它们提供的方法可以实现与浏览器和页面元素的各种交互操作。WebDriver 提供了许多用来与浏览器交互的功能和设置,我们可以通过使用 WebDriver 的功能和一些方法来实现与浏览器窗口、警告、框架和弹出窗口的交互,它也提供了自动化操作浏览器导航...

weixin_34248849的博客 108

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,将首次通过简单示例了解轮廓的基本概念,然后通过实际示例来了解如何检测和压缩轮廓,最后利用介绍如何利用图像矩描述检测到的轮廓属性。

盼小辉丶的博客 3万+

【转载】Selenium2.0 WebDriver入门指南

转自:http://my.oschina.net/willSoft/blog/28119 1.1  下载selenium2.0的lib包 http://code.google.com/p/selenium/downloads/list 官方User Guide:http://seleniumhq.org/docs/ 1.2  用webdriver打开一个浏览器 我们常用的

bwgang 758

【unity小技巧】常用的方法属性和技巧汇总(长期更新,2025/07/02更新)

Unity开发技巧摘要 本文汇总了Unity开发中的实用技巧,包括移动控制、力应用、物体翻转、单例模式实现等。移动方面介绍了MoveTowards、MovePosition、Translate等方法的区别与应用场景;力应用部分详解了AddForce系列方法的参数和使用方式;物体翻转对比了三种实现方案;单例模式提供了标准实现和泛型优化版本;还收录了绝对值计算、鼠标检测、旋转控制、数值取整等实用代码片段。这些经过验证的技巧能有效提升开发效率,文章将持续更新补充新的实用内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3348

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: Selenium2 WebDriver入门
下一篇: dom4j vs. jdom
八白龙
博客等级 码龄19年 15粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值