前阵子因为要进行支持多浏览器的自动化测试,原来selenium1.0仅支持到firefox3.6,IE8,chrome4的版本,而公司GA数据显示用户多使用IE9,Firefox20,chrome26,很显然selenium1.0已不再满足当前也业务需求,为了更好进行兼容性测试,升级selenium已经迫在眉睫。(PS.这篇文章重点讲的是selenium1.0升级到2.0的内容,关于如何使用selenium开展自动化测试不是本文的范畴,大家可以去网上找一下,有很多这方面的资料)
因为我们使用的是JAVA+TestNG+Maven+Selenium自动化测试框架,以下内容均是基于该框架进行的阐述。
1. 修改dependency
把Pom.xml文件中的dependency进行修改:
<dependency>
<groupId>com.thoughtworks</groupId>
<artifactId>selenium-java-client-driver</artifactId>
<version>2.25.0</version>
</dependency>
变为:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.31.0</version>
</dependency>
然后编译即可下载对应的jar包。
2. 创建WebDriver实例
1.0中直接通过一个方法创建实例,参数可以定义static变量传入。
public static Selenium createInstance()
{
instance = new SeleniumInstance(SELENIUM_SERVER,
SELENIUM_SERVER_PORT, BROWSER, DEFAULT_URL);
return instance;
}
2.0中因为IE及chrome的特殊性,可以在googlecode上下载对应的文件到本地磁盘,然后引入chromedriver及IEDriverServer的路径,这里说明下:
1) webdriver对firefox浏览器支持的比较好,从工作实践来看没有多少棘手的问题;
2) 对chrome的支持其实是Chromium项目自己支持和维护的,需要额外下载对应的standalone server以实现webdriver的通路协议,以支持webdriver;
3)而IEDriverService.exe是webdriver驱动IE浏览器的代理器,也就是做webdriver驱动IE做相应的动作时,都需要通过IEDriverServer.exe来通知IE,本质上IEDriverServer.exe是对IE实现的DOM接口进行了二次封装;
4)以下代码中因为safari需要真实运行于MAC系统下,所以通过Grid来执行,关于grid也可以网上去找找相关资料。
相关code:
public static WebDriver createInstance() throws MalformedURLException {
if (BROWSER == "Firefox"){
driverInstance = new FirefoxDriver();
driverInstance.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driverInstance.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driverInstance.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
} else if (BROWSER == "Safari"){
DesiredCapabilities capability = DesiredCapabilities.safari();
driverInstance = new RemoteWebDriver(new URL("http://192.168.61.138:5555/wd/hub"),capability);
capability.setBrowserName("safari");
capability.setPlatform(Platform.MAC);
capability.setVersion("6.0.2");
} else if (BROWSER == "Chrome"){
System.setProperty("webdriver.chrome.driver","D:\\selenium\\selenium-server-2.31.0\\chromedriver.exe");
driverInstance = new ChromeDriver();
} else if (BROWSER == "iExplore"){
System.setProperty("webdriver.ie.driver", "D:\\selenium\\selenium-server-2.31.0\\IEDriverServer.exe");
DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
driverInstance = new InternetExplorerDriver(capabilities);
} else if (BROWSER == "HtmlUnit" ) {
driverInstance = new HtmlUnitDriver(true);
}
return driverInstance;
}
3. 完成以上两步,就差不多把所需的东西准备好了,接下来就需要一步步开工了。首先,把底层框架中启动和停止server的代码修改为最新的
1.0中需要启动server才能运行,而在2.0中如果不通过Remote来运行的话是不需要启动server的,这里提到的启动实际是实例化过程,这中间会启动浏览器,停止时会释放资源并关闭浏览器。
protected static void startdriver() {
if (driver == null ){
try {
driver = DriverInstance.createInstance();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static void stopDriver() {
//stop driver;
if (driver != null) {
driver.quit();
if ( browser == "Firefox") {
closeFireFox();
} else if (browser == "Chrome") {
closeChromeDriver();
}
}
}
4. 把底层框架中1.0的方法修改为2.0的,以下做一个对比
方法 | Selenium1.0 | Selenium2.0 |
打开页面 | Selenium.open(String url); | Driver.get(String url); |
点击元素 | Selenium.click(String arg0); | driver.findElement(By).click(); |
输入框 | selenium.type(String arg0, String arg1); arg0为元素定位,arg1为输入的值, 再次type时会清空了输入 | WebElement element = driver.findElement(By); element.sendkeys(arg0); 需要使用element.clear();来清空内容。 |
下拉选择框 | Selenium.select(String arg0, String arg1); arg0为元素定位,arg1为选择的值 | 找到下拉框元素: Select select=new Select(driver.findElement(By)); 选择对应的选择项: select.selectByVisibleText(String text); //通过文本选择 select.selectByValue(String value); //通过value选择 select.selectByIndex(int index) //通过序号选择 |
单选多选框 | 选择: selenium.check(String locator); 不选: selenium.check(String locator); 判断是否选择: Boolean isChecked(String locator); | 定位元素: WebElement element =driver.findElement(By); 点击:Element.click(); 清除:Element.clear(); 判断是否选择: Boolean isSelected(); 判断是否可选择:Boolean isEnabled(); |
获取文本内容 | selenium.getText(String locator); | WebElement element =driver.findElement(By); element.getText(); |
弹出框 | Selenium.chooseOkOnNextConfirmation(); Selenium.chooseCancelOnNextConfirmation(); Selenium.getConfirmation(); 该方法我使用后没有成功,所以一直很纠结 | Alert alert = driver.switchTo().alert(); alert.accept(); //点击OK alert.dismiss(); //点击cancel alert.getText(); //获取弹出框文本 2.0很好的处理了弹出框问题。 |
frame | 1.0中对frame没有特殊处理跟其他元素一样 | 2.0中需要在frame与defaultContent切换后才能定位, 否则会出现找不到元素的问题 driver.switchTo().defaultContent(); //切换到默认页面内容 driver.switchTo().frame(WebElement frameElement); //切换到对应的frame中 |
页面等待 | selenium.waitForPageToLoad(String arg0); 直接有方法实现页面加载 | driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); //页面加载等待时间 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); //定位元素等待时间 driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); //异步加载等待时间 但是只是在firefox上才能起作用,其他浏览器需要 自己实现对应的方法。 |
隐藏元素 | 在1.0中直接可以操作,即使该元素的style为”display:none” | 如果不显示的元素是无法定位的,那就需要触发mouseover 之后才能定位。 |
以上表格中提到的如何通过By定位元素的内容可以参考以下文章:
http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/By.html
5. 通过以上几步的努力,1.0->2.0就还剩下最后一步,运行调试脚本的工作了。
===========================
添加微信“zzzmmmkkk”,可以通过:
1. 请在微信“添加好友”->“搜索公众账号”里查找“zzzmmmkkk”
2. 或者点击本文右上角按钮后选择“关注公众账号”
3. 扫描头像
zzzmmmkkk,本名赵敏科,6年测试经验,2年项目及团队管理经验,从事过多年功能测试,性能测试及自动化测试,乐于分享。
不定期发布有关测试技术文章,测试经验分享,测试思考和问题探讨。