51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1165|回复: 2
打印 上一主题 下一主题

【转帖】Selenium2.0之WebDriver学习总结(1)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-7-12 15:58:55 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

(一)   Selenium2.0 VS Selenium1.0
我们已经有了Selenium1.0为什么还需要Selenium2.0呢?
Selenium1.0不能处理一下事件:
1)本机键盘和鼠标事件
2)同源策略XSS/HTTP(S)
3)弹出框,对话框(基本身份认证,自签名的证书和文件上传/下载)
Selenium2.0有简洁的API,WebDriver和WebElement对象,更好的抽象。且支持多中操作系统,多语言,多浏览器。
同时Selenium2.0进行了架构的调整和升级:
Selenium2.0 = Selenium1.0 + WebDriver(也就是说Selenium2.0合并了这两个项目)
Selenium1.0可以使用任何编程语言,但是有个先决条件就是必须支持HTTP库。Selenium1.0起初就是一个Javascript库,到后面引入了SeleniumRC。SeleniumRC作为一个代理服务器并且发送操作命令给Selenium Core(javascript代码,且为SeleniumRC的一部分)。SeleniumRC从测试程序接收指令并翻译,返回测试结果给测试程序。Selenium Core在client API打开浏览器后就注入到浏览器中,然后Selenium Core接收测试程序的指令,解释成selenese命令,在浏览器执行。
Selenium1.0作为第一个基于javascript开源的web测试框架,迅速的得到了其他浏览器的支持。但是和任何其他大项目一样,Selenium1.0也不是完美的。正因为他完全是使用javascript写的,这也给他带来了致命的缺陷。为了防止恶意的javascript,所有浏览器都加强了对javascript的安全策略。这样势必导致了在一些特定场景无法使用Selenium1.0。作为一个大项目,随着时间的日积月累,Selenium1.0的API变得越来也大,也越来也复杂,导致了都不知道更好的使用它改善它。
WebDriver项目是由Simon Stewart 提出的,它是一个轻便简洁的自动化测试框架。WebDriver通过尝试不同的方法去解决Selenium1.0所面临的问题。不单单是使用javascript,WebDriver会使用任何一种更合适的机制来操作浏览器。IE通过使用C++,FF通过使用javascript in a XPCOM component。
通过更灵活的机制去操控浏览器,那我们就能很好的绕过浏览器javascript的安全限制。当这些技术还不够用时,我们可以调用系统设备操作,尤其是当你需要一些键盘和鼠标操作时,通过这些技术,我们可以更好的模拟用户的真实浏览器操作。
当这两个框架被合并后,一个框架的缺陷被另一个框架所弥补。WebDriver对浏览器的支持需要对应框架开发工程师做对应的开发;同样Selenium必须操作真实浏览器,但是WebDriver可以HTML unit Driver来模拟浏览器,在内存中执行用例,更加的轻便。Selenium1.0解决了自动化测试中的一些常见问题,WebDriver更好的解决了沙箱限制。WebDriver不支持并行,但是Selenium Grid解决了这个问题。
(二)   WebDriver
a)WebDirver小实例
WebDriver是一个用来进行复杂重复的web自动化测试的工具。意在提供一种比Selenium1.0更简单易学,有利于维护的API。它没有和任何测试框架进行绑定,所以他可以很好的在单元测试和main方法中调用。一旦创建好一个Selenium工程,你马上会发现WebDriver和其他类库一样:它是完全独立的,你可以直接使用而不需要考虑其他配置,这个Selenium RC是截然相反的。
下面我们就开始进入WebDriver的实际应用,首先大家下载好eclipse,还有从selenium官方网站下载selenium2.0的jar包和chromedriver的驱动文件。构建整个工程如下模式:

现在我们开始写代码:
CODE:
  1. <br />
  2. package demo;<br />
  3. import org.openqa.selenium.By;<br />
  4. import org.openqa.selenium.WebDriver;<br />
  5. import org.openqa.selenium.WebElement;<br />
  6. import org.openqa.selenium.firefox.FirefoxDriver;<br />
  7. import org.openqa.selenium.support.ui.ExpectedCondition;<br />
  8. import org.openqa.selenium.support.ui.WebDriverWait;<br />
  9. public class Selenium2Example  {<br />
  10.      public static void main(String[] args) {<br />
  11.          //创建一个WebDriver实例<br />
  12.          WebDriver driver = new FirefoxDriver();<br />
  13.          // 访问google<br />
  14.          driver.get("http://www.google.com");<br />
  15.          // 另一种访问方法<br />
  16.          // driver.navigate().to("http://www.google.com");<br />
  17.          // 找到文本框<br />
  18.          WebElement element = driver.findElement(By.name("q"));<br />
  19.          // 输入搜索关键字<br />
  20.          element.sendKeys("Selenium");<br />
  21.          //提交表单 WebDriver会自动从表单中查找提交按钮并提交<br />
  22.          element.submit();<br />
  23.          // 检查页面title<br />
  24.          System.out.println("Page title is: " + driver.getTitle());<br />
  25.          // google查询结果是通过javascript动态呈现的.<br />
  26.          // 设置页面等待10秒超时<br />
  27.          (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {<br />
  28.               public Boolean apply(WebDriver d) {<br />
  29.                   return d.getTitle().toLowerCase().startsWith("Selenium");<br />
  30.               }<br />
  31.          });<br />
  32.          // 显示查询结果title<br />
  33.          System.out.println("Page title is: " + driver.getTitle());<br />
  34.          //关闭浏览器<br />
  35.          driver.quit();<br />
  36.      }<br />
  37. }<br />
复制代码
b)介绍WebDriver的Drivers
WebDriver是测试中必须要写的关键接口的名字,但是他有多种实现,包括下面:
HtmlUnit Driver:这是目前最快,最轻巧的实施的WebDriver。顾名思义,这是基于HtmlUnit。 HtmlUnit是Java一个WebBrowser没有图形用户界面的实现。
用法:
CODE:
  1. <br />
  2. WebDriver driver = new HtmlUnitDiver();<br />
复制代码
例子:
CODE:
  1. package demo;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.WebElement;
  5. import org.openqa.selenium.htmlunit.HtmlUnitDriver;
  6. import org.openqa.selenium.support.ui.ExpectedCondition;
  7. import org.openqa.selenium.support.ui.WebDriverWait;
  8. public class DemoUseHtmlUnit {
  9. public static void main(String[] args) {
  10.   //创建一个WebDriver实例
  11.   WebDriver driver = new HtmlUnitDriver();
  12.          // 访问google
  13.          driver.get("http://www.google.com");
  14.          // 找到文本框
  15.          WebElement element = driver.findElement(By.name("q"));
  16.          // 输入搜索关键字
  17.          element.sendKeys("Selenium");
  18.          //提交表单 WebDriver会自动从表单中查找提交按钮并提交
  19.          element.submit();
  20.          // 检查页面title
  21.          System.out.println("Page title is: " + driver.getTitle());
  22.          // google查询结果是通过javascript动态呈现的.
  23.          // 设置页面等待10秒超时
  24.          (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  25.              public Boolean apply(WebDriver d) {
  26.                  return d.getTitle().toLowerCase().startsWith("selenium");
  27.              }
  28.          });
  29.          // 显示查询结果title
  30.          System.out.println("Page title is: " + driver.getTitle());
  31.          //关闭浏览器
  32.          driver.quit();
  33.   }
  34. }
复制代码
优点:
  • WebDriver最快的实现方式
  • 纯java跨平台性好
  • 支持javascript
缺点:
  • 模拟其他浏览器的JavaScript行为(见下文)
现今流行的浏览器没有使用HtmlUnit所使用的JavaScript引擎。如果使用HtmlUnit测试JavaScript的结果可能会与实际使用浏览器不同。当我们说“JAVASCRIPT”其实我们的意思是“JavaScript和DOM”。虽然DOM是由W3C定义的,但是每个浏览器都有自己的方式使用JavaScript来实现DOM。 HtmlUnit对JavaScript操作DOM具有良好的支持和完整实现,给人留下了深刻的印象,但它和任何其他浏览器一样:它有自己的方式和W3C标准的主流浏览器的DOM实现差异,尽管其有模仿其他浏览器的能力。
支持javascript:
CODE:
  1. HtmlUnitDriver driver = new HtmlUnitDriver(true);
复制代码
注:HtmlUnitDriver默认是模拟firefox3.6来处理javascript。(具体作用还未研究)
Firefox Driver:这是一个比较好的WebDriver,目前已经支持到了10.0版本。运行Firefox需要加载Selenium WebDriver.xpi插件。
用法:
CODE:
  1. WebDriver driver = new FirefoxDriver();
复制代码
WebDriver driver = new FirefoxDriver();
例子:
CODE:
  1. package demo;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import org.openqa.selenium.By;
  5. import org.openqa.selenium.WebDriver;
  6. import org.openqa.selenium.WebElement;
  7. import org.openqa.selenium.firefox.FirefoxDriver;
  8. import org.openqa.selenium.firefox.FirefoxProfile;
  9. import org.openqa.selenium.support.ui.ExpectedCondition;
  10. import org.openqa.selenium.support.ui.WebDriverWait;
  11. public class DemoUseFirefox {
  12. public static void main(String[] args) {
  13.   //创建一个WebDriver实例
  14.   WebDriver driver = new FirefoxDriver();
  15.         // 访问google
  16.         driver.get("http://www.google.com");
  17.         // 找到文本框
  18.         WebElement element = driver.findElement(By.name("q"));
  19.         // 输入搜索关键字
  20.         element.sendKeys("Selenium");
  21.         //提交表单 WebDriver会自动从表单中查找提交按钮并提交
  22.         element.submit();
  23.         // 检查页面title
  24.         System.out.println("Page title is: " + driver.getTitle());
  25.         // google查询结果是通过javascript动态呈现的.
  26.         // 设置页面等待10秒超时
  27.         (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  28.             public Boolean apply(WebDriver d) {
  29.                 return d.getTitle().toLowerCase().startsWith("selenium");
  30.             }
  31.         });
  32.         // 显示查询结果title
  33.         System.out.println("Page title is: " + driver.getTitle());
  34.         //关闭浏览器
  35.         driver.quit();
  36. }
  37. }
复制代码
优点:
  • 在真正的浏览器上运行,且支持javascript
  • 运行速度快于IE
缺点:
  • 运行速度低于HtmlUnit Driver

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2017-7-12 16:03:40 | 只看该作者
WebDriver-Backed Selenium-RC:WebDriver提供了Selenium-RC的实现,这表示你可以通过Selenium-RC API来使用WebDriver的基础功能。这主要是为了向后兼容。他允许通过适当的转换,那些已经用Selenium-RC API编写的用例能在WebDriver下使用。
用法:
CODE:
  1. Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
复制代码
例子:
CODE:
  1. package demo;

  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebDriverBackedSelenium;
  4. import org.openqa.selenium.firefox.FirefoxDriver;
  5. import org.openqa.selenium.support.ui.ExpectedCondition;
  6. import org.openqa.selenium.support.ui.WebDriverWait;
  7. import com.thoughtworks.selenium.Selenium;

  8. public class DemoUseBacked {
  9. public static void main(String[] args) {
  10. //创建一个WebDriver实例
  11. WebDriver driver = new FirefoxDriver();
  12. String baseUrl = "http://www.youdao.com";
  13. //启动一个Selenium
  14. Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
  15. // 访问google
  16. selenium.open(baseUrl);
  17. // 输入搜索关键字
  18. selenium.type("id=query", "selenium");
  19. //点击 搜索
  20. selenium.click("id=qb");

  21. // 检查页面title
  22. System.out.println("Page title is: " + driver.getTitle());

  23. // google查询结果是通过javascript动态呈现的.
  24. // 设置页面等待10秒超时
  25. (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  26. public Boolean apply(WebDriver d) {
  27. return d.getTitle().toLowerCase().startsWith("selenium");
  28. }
  29. });

  30. // 显示查询结果title
  31. System.out.println("Page title is: " + driver.getTitle());

  32. //停止Selenium
  33. selenium.stop();
  34. }
  35. }
复制代码
优点:
  • 允许WebDriver和Selenium API直接兼容
  • 提供selenium RC向WebDriver迁移
  • 不需要对立的运行Selenium RC server
缺点:
  • 不是所有方法都可以使用
  • 由于底层实现的差别,切换后有些方法会运行变慢

回复 支持 反对

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2017-7-12 16:03:18 | 只看该作者
修改Firefox的配置文件:FirefoxDriver可以通过自己设置Firefox的配置文件,如启动浏览器时,加载Firebug插件。
CODE:
  1. File file = new File(".\\res\\firebug-1.9.1-fx.xpi");
  2. FirefoxProfile firefoxProfile = new FirefoxProfile();
  3. try {
  4.   firefoxProfile.addExtension(file);
  5. } catch (IOException e) {
  6.   // TODO Auto-generated catch block
  7.   e.printStackTrace();
  8. }
  9. firefoxProfile.setPreference("extensions.firebug.currentVersion","1.9.1");
复制代码
例子:
CODE:
  1. package demo;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import org.openqa.selenium.By;
  5. import org.openqa.selenium.WebDriver;
  6. import org.openqa.selenium.WebElement;
  7. import org.openqa.selenium.firefox.FirefoxDriver;
  8. import org.openqa.selenium.firefox.FirefoxProfile;
  9. import org.openqa.selenium.support.ui.ExpectedCondition;
  10. import org.openqa.selenium.support.ui.WebDriverWait;
  11. public class DemoUseFirefox {
  12. public static void main(String[] args) {
  13.   // 创建一个WebDriver实例
  14.   File file = new File(".\\res\\firebug-1.9.1-fx.xpi");// firebug插件的本地位置
  15.   FirefoxProfile firefoxProfile = new FirefoxProfile();
  16.   try {
  17.    firefoxProfile.addExtension(file);
  18.   } catch (IOException e) {
  19.    // TODO Auto-generated catch block
  20.    e.printStackTrace();
  21.   }
  22.   firefoxProfile.setPreference("extensions.firebug.currentVersion","1.9.1");
  23.   WebDriver driver = new FirefoxDriver(firefoxProfile);
  24.   // 访问google
  25.   driver.get("http://www.google.com");
  26.   // 另一种访问方法
  27.   WebElement element = driver.findElement(By.name("q"));
  28.   // 输入搜索关键字
  29.   element.sendKeys("Selenium");
  30.   // 提交表单 WebDriver会自动从表单中查找提交按钮并提交
  31.   element.submit();
  32.   // 检查页面title
  33.   System.out.println("Page title is: " + driver.getTitle());
  34.   // google查询结果是通过javascript动态呈现的.
  35.   // 设置页面等待10秒超时
  36.   (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  37.    public Boolean apply(WebDriver d) {
  38.     return d.getTitle().toLowerCase().startsWith("selenium");
  39.    }
  40.   });
  41.   // 显示查询结果title
  42.   System.out.println("Page title is: " + driver.getTitle());
  43.   // 关闭浏览器
  44.   driver.quit();
  45. }
  46. }
复制代码
Internet Explorer Driver:该驱动需要一个dll文件,故只能在windows系统下使用。所有Selenium版本的都有对xp下的IE6,7,8和windows7下的IE9支持。
用法:
CODE:
  1. WebDriver driver = new InternetExplorerDriver();
复制代码
CODE:
  1. package demo;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.WebElement;
  5. import org.openqa.selenium.ie.InternetExplorerDriver;
  6. import org.openqa.selenium.support.ui.ExpectedCondition;
  7. import org.openqa.selenium.support.ui.WebDriverWait;
  8. public class DemoUseIE {
  9. public static void main(String[] args) {
  10.   // 创建一个WebDriver实例
  11.   WebDriver driver = new InternetExplorerDriver();
  12.   // 访问google
  13.   driver.get("http://www.google.com");
  14.   // 找到文本框
  15.   WebElement element = driver.findElement(By.name("q"));
  16.   // 输入搜索关键字
  17.   element.sendKeys("Selenium");
  18.   // 提交表单 WebDriver会自动从表单中查找提交按钮并提交
  19.   element.submit();
  20.   // 检查页面title
  21.   System.out.println("Page title is: " + driver.getTitle());
  22.   // google查询结果是通过javascript动态呈现的.
  23.   // 设置页面等待10秒超时
  24.   (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  25.    public Boolean apply(WebDriver d) {
  26.     return d.getTitle().toLowerCase().startsWith("selenium");
  27.    }
  28.   });
  29.   // 显示查询结果title
  30.   System.out.println("Page title is: " + driver.getTitle());
  31.   // 关闭浏览器
  32.   driver.quit();
  33. }
  34. }
复制代码
优点:
  • 运行于真正的浏览器,且支持各种用户终端的javascript。
缺点:
  • IE Driver只能工作在windows下
  • 运行速度相对较慢
  • 大部分版本下XPach没有原生支持,由于Sizzle是自动注入,所以运行速度低于其他浏览器,CSS渲染也比较慢;
  • CSS不是原生支持IE6和IE7的,Sizzle是强行注入的;
  • IE8,9是原生支持CSS的,但是他们不完全支持CSS3;
需要的配置项:
在ie7还有win7和vista系统下,我们必须将浏览器设置成安全模式

如果要使用鼠标事件,必须确定浏览器是100%缩放的
Chrome Driver:是一个独立的服务器,是由Chromium项目组协助开发的。ChromeDriver由三个部件组成:chrome浏览器本身,支持ChromeDriver的语言和支持ChromeDriver和Chrome之间通信的工程。使用ChromeDriver必须启动一个后台程序(即:支持ChromeDriver的语言和支持ChromeDriver和Chrome之间通信的工程)。
用法:
CODE:
  1. WebDriver driver = new ChromeDriver();
复制代码
例子:
CODE:
  1. package demo;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.WebElement;
  5. import org.openqa.selenium.chrome.ChromeDriver;
  6. import org.openqa.selenium.support.ui.ExpectedCondition;
  7. import org.openqa.selenium.support.ui.WebDriverWait;
  8. public class DemoUseChrome {
  9. public static void main(String[] args) {
  10.   // 配置服务器
  11.   System.setProperty("webdriver.chrome.driver",
  12.     ".\\res\\chromedriver.exe");
  13.   // 创建一个WebDriver实例
  14.   WebDriver driver = new ChromeDriver();
  15.   // 访问google
  16.   driver.get("http://www.google.com");
  17.   // 找到文本框
  18.   WebElement element = driver.findElement(By.name("q"));
  19.   // 输入搜索关键字
  20.   element.sendKeys("Selenium");
  21.   // 提交表单 WebDriver会自动从表单中查找提交按钮并提交
  22.   element.submit();
  23.   // 检查页面title
  24.   System.out.println("Page title is: " + driver.getTitle());
  25.   // google查询结果是通过javascript动态呈现的.
  26.   // 设置页面等待10秒超时
  27.   (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  28.    public Boolean apply(WebDriver d) {
  29.     return d.getTitle().toLowerCase().startsWith("selenium");
  30.    }
  31.   });
  32.   // 显示查询结果title
  33.   System.out.println("Page title is: " + driver.getTitle());
  34.   // 关闭浏览器
  35.   driver.quit();
  36. }
  37. }
复制代码
优点:
运行在真正的浏览器上,且支持javascript;
由于Chrome是Webkit内核的浏览器,所以Chrome Driver可以一定程度上测试Safari。但是需要注意的是Chrome使用自己的V8 javascript引擎,而Safari是Nitro引擎,在javascript的执行上还是有区别的。
缺点:
运行速度低于HtmlUnit Driver
Chrome高级设置:
我们可以使用一些命令行指令来配置浏览器,类似Firefox。如最大化浏览器:
CODE:
  1. DesiredCapabilities capabilities = DesiredCapabilities.chrome();
  2. capabilities.setCapability("chrome.switches", Arrays.asList("--start-maximized"));
  3. WebDriver driver = new ChromeDriver(capabilities);
复制代码
例子:
CODE:
  1. package demo;
  2. import java.util.Arrays;
  3. import org.openqa.selenium.By;
  4. import org.openqa.selenium.WebDriver;
  5. import org.openqa.selenium.WebElement;
  6. import org.openqa.selenium.chrome.ChromeDriver;
  7. import org.openqa.selenium.remote.DesiredCapabilities;
  8. import org.openqa.selenium.support.ui.ExpectedCondition;
  9. import org.openqa.selenium.support.ui.WebDriverWait;
  10. public class DemoUseChrome {
  11. public static void main(String[] args) {
  12.   // 配置服务器
  13.   System.setProperty("webdriver.chrome.driver",
  14.     ".\\res\\chromedriver.exe");
  15.   // 创建一个WebDriver实例
  16.   DesiredCapabilities capabilities = DesiredCapabilities.chrome();
  17.   capabilities.setCapability("chrome.switches",
  18.     Arrays.asList("--start-maximized"));
  19.   WebDriver driver = new ChromeDriver(capabilities);
  20.   // 访问google
  21.   driver.get("http://www.google.com");
  22.   // 另一种访问方法
  23.   // driver.navigate().to("http://www.google.com");
  24.   // 找到文本框
  25.   WebElement element = driver.findElement(By.name("q"));
  26.   // 输入搜索关键字
  27.   element.sendKeys("Selenium");
  28.   // 提交表单 WebDriver会自动从表单中查找提交按钮并提交
  29.   element.submit();
  30.   // 检查页面title
  31.   System.out.println("Page title is: " + driver.getTitle());
  32.   // google查询结果是通过javascript动态呈现的.
  33.   // 设置页面等待10秒超时
  34.   (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
  35.    public Boolean apply(WebDriver d) {
  36.     return d.getTitle().toLowerCase().startsWith("selenium");
  37.    }
  38.   });
  39.   // 显示查询结果title
  40.   System.out.println("Page title is: " + driver.getTitle());
  41.   // 关闭浏览器
  42.   driver.quit();
  43. }
  44. }
复制代码

回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-26 18:33 , Processed in 0.066080 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表