自动化测试——工具selenium使用文档

发表于:2017-9-20 13:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:抓兔子的猫    来源:51Testing软件测试网采编

  用户输入 - 填充表单
  我们已经了解了怎么在输入框或者文本框中输入文字,但是如何操作其他的表单元素呢?你可以切换多选框的选中状态,你可以通过“点击”以选中一个 select 的选项。操作 select 元素不是一件很难的事情:
  WebElement select = driver.findElement(By.tagName("select"));
  List<WebElement> allOptions = select.findElements(By.tagName("option"));
  for (WebElement option : allOptions) {
      System.out.println(String.format("Value is: %s", option.getAttribute("value")));
      option.click();
  }
  上述代码将找到页面中第一个 select 元素,然后遍历其中的每个 option,打印其值,再依次进行点击操作以选中这个 option。这并不是处理 select 元素最高效的方式。WebDriver 有一个叫 “Select” 的类,这个类提供了很多有用的方法用于 select 元素进行交互。
  Select select = new Select(driver.findElement(By.tagName("select")));
  select.deselectAll();
  select.selectByVisibleText("Edam");
  上述代码取消页面上第一个 select 元素的所有 option 的选中状态,然后选中字面值为 “Edam” 的 option。
  如果你已经完成表单填充,你可能希望提交它,你只要找到 “submit” 按钮然后点击它即可。
  driver.findElement(By.id("submit")).click();
  或者,你可以调用 WebDriver 为每个元素提供的 “submit” 方法。如果你对一个 form 元素调用该方法,WebDriver 将调用这个 form 的 submit 方法。如果这个元素不是一个 form,将抛出一个异常。
  element.submit();
  在窗口和帧(frames)之间切换
  有些 web 应用含有多个帧或者窗口。WebDriver 支持通过使用 “switchTo” 方法在多个帧或者窗口之间切换。
  driver.switchTo().window("windowName");
  所有 dirver 上的方法调用均被解析为指向这个特定的窗口。但是我们如何知道这个窗口的名字?来看一个打开窗口的链接:
  <a href="somewhere.html" target="windowName">Click here to open a new window</a>
  你可以将 “window handle” 传递给 “switchTo().window()” 方法。因此,你可以通过如下方法遍历所有打开的窗口:
  for (String handle : driver.getWindowHandles()) { driver.switchTo().window(handle); }
  你也可以切换到指定帧:
  driver.switchTo().frame("frameName");
  你可以通过点分隔符来访问子帧,也可以通过索引号指定它,例如:
  driver.switchTo().frame("frameName.0.child");
  该方法将查找到名为 “frameName” 的帧的第一个子帧的名为 “child” 的子帧。所有帧的计算都会从 top 开始。
  弹出框
  由 Selenium 2.0 beta 1 开始,就内置了对弹出框的处理。如果你触发了一个弹出框,你可以通过如下方访问到它:
  Alert alert = driver.switchTo().alert();
  该方法将返回目前被打开的弹出框。通过这个返回对象,你可以访问、关闭、读取它的内容甚至在 prompt 中输入一些内容。这个接口可以胜任 alerts,comfirms 和 prompts 的处理。
  导航:历史记录和位置
  更早的时候,我们通过 “get” 方法来访问一个页面 (driver.get("http://www.example.com"))。正如你所见,WebDriver 有一些更小巧的、聚焦任务的接口,而 navigation 就是其中一个非常有用的任务。因为加载页面是一个非常基本的需求,实现该功能的方法取决于 WebDriver 暴露的接口。它等同于如下代码:
  driver.navigate().to("http://www.example.com");
  重申一下: “navigate().to()” 和 “get()” 做的事情是完全一样的。只是前者更易用。
  “navigate” 接口暴露了访问浏览器历史记录的接口:
  driver.navigate().forward();
  driver.navigate().back();
  需要注意的是,该功能的表现完全依赖于你所使用的浏览器。如果你习惯了一种浏览器,那么在另一种浏览器中使用它时,完全可能发生一些意外的事情。
  Cookies
  在我们继续介绍更多内容之前,还有必要介绍一下如何操作 cookie。首先,你必须在 cookie 所在的域。如果你希望在加载一个大页面之前重设 cookie,你可以先访问站点中一个较小的页面,典型的是 404 页面 (http://example.com/some404page)。%E3%80%82)
  // 进到正确的域
  driver.get("http://www.example.com");
  // 设置 cookie,这个cookie 对整个域都有效
  Cookie cookie = new Cookie("key", "value");
  driver.manage().addCookie(cookie);
  // 输出当前 url 所有可用的 cookie
  Set<Cookie> allCookies = driver.manage().getCookies();
  for (Cookie loadedCookie : allCookies) {
      System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
  }
  // 你可以通过3中方式删除 cookie
  // By name
  driver.manage().deleteCookieNamed("CookieName");
  // By Cookie
  driver.manage().deleteCookie(loadedCookie);
  // Or all of them
  driver.manage().deleteAllCookies();
  改变 UA
  当使用 Firefox Driver 的时候这很容易:
  FirefoxProfile profile = new FirefoxProfile();
  profile.addAdditionalPreference("general.useragent.override", "some UA string");
  WebDriver driver = new FirefoxDriver(profile);
  拖拽
  以下代码演示了如何使用 “Actions” 类来实现拖拽。浏览器本地方法必须要启用:
  WebElement element = driver.findElement(By.name("source"));WebElement target = driver.findElement(By.name("target"));(new Actions(driver)).dragAndDrop(element, target).perform();
  Driver 特性和权衡
  Selenium-WebDriver’s Drivers
  WebDriver 是编写测试时需要用到的方法的主要接口,这套接口有几套实现。包括:
  HtmlUnit Driver
  这是目前 WebDriver 最快速最轻量的实现。顾名思义,它是基于 HtmlUnit 的。HtmlUnit 是一个由 Java 实现的没有 GUI 的浏览器。任何非 Java 的语言绑定, Selenium Server 都需要使用这个 driver。
  使用
  WebDriver driver = new HtmlUnitDriver();
  优势
  ●WebDriver 最快速的实现
  ●纯 Java 实现,跨平台
  ●支持 JavaScript
  劣势
  需要模拟浏览器中 JavaScript 的行为(如下)。
  JavaScript in the HtmlUnit Driver
  没有任何一个主流浏览器支持 HtmlUnit 使用的 JavaScript 引擎(Rhino)。如果你使用 HtmlUnit,测试结果可能和真实在浏览器中跑的很不一样。
  当我们说到 “JavaScript” 时通常是指 “JavaScript 和 DOM”。虽然 DOM 由 W3C 组织定义,但是每个浏览器在 DOM 和 JavaScript 的交互的实现方面都有一些怪异和不同的地方。HtmlUnit 完全实现了 DOM 规范,并且对 JavaScript 提供了良好的支持,但它的实现和真实的浏览器都不一样:虽然它模拟了浏览器中的实现,但既不同于 W3C 指定的标准,也不同于其他主流浏览器的实现。
  使用 WebDriver,我们需要做出选择:如果我们启用 HtmlUnit 的 JavaScript 支持,团队可能会遇到只有在这中情况下才会遇到的问题;如果我们禁用 JavaScript,但实际上越来越多的网站都依赖于 JavaScript。我们使用了最保守的方式,默认禁用 JavaScript 支持。对于 WebDriver 和 HtmlUnit 的每个发布版本,我们都会再次评估:这个版本是否可以默认开启 JavaScript 支持。
  启用 JavaScript
  启用 JavaScript 也非常简单:
  HtmlUnitDriver driver = new HtmlUnitDriver(true);
  上述代码会使得 HtmlUnit Driver 模拟 Firefox3.6 对 JavaScript 的处理。
  Firefox Driver
  我们通过一个 Firefox 的插件来控制 Firefox 浏览器。使用的配置文件是从默认安装的版本精简成只包含 Selenium WebDriver.xpi (插件) 的版本。我们还修改了一些默认配置(see the source to see which ones),使得 Firefox Driver 可以运行和测试在 Windows、Mac、Linux 上。
  使用
  WebDriver driver = new FirefoxDriver();
  优势
  在真实的浏览器里运行,且支持 JavaScript
  比 IE Driver 快
  劣势
  ●比 HtmlUnit Driver 慢
  ●需要修改 Firefox 配置
  例如你想修改 UA,但是你得到的是一个假的包含很多扩展的配置文件。这里有两种方式可以拿到真是的配置,假定配置文件是由 Firefox 配置管理器生成的:
  ProfilesIni allProfiles = new ProfilesIni();
  FirefoxProfile profile = allProfiles.getProfile("WebDriver");
  profile.setPreferences("foo.bar", 23);
  WebDriver driver = new FirefoxDriver(profile);
  如果配置文件没有注册至 Firefox:
  File profileDir = new File("path/to/top/level/of/profile");
  FirefoxProfile profile = new FirefoxProfile(profileDir);
  profile.addAdditionalPreferences(extraPrefs);
  WebDriver driver = new FirefoxDriver(profile);
  当我们开发 Firefox Driver 的特性时,需要评估它们是否可用。例如,直到我们认为本地方法在 Linux 的 Firefox 上是稳定的了,否则我们会默认禁用它。如需开启:
  FirefoxProfile profile = new FirefoxProfile();
  profile.setEnableNativeEvents(true);
  WebDriver driver = new FirefoxDriver(profile);
  信息
  查看 Firefox section in the wiki page 以获得更多新鲜信息。
  Internet Explorer Driver
  这个 driver 由一个 .dll 文件控制,并且只在 windows 系统中可用。每个 Selenium 的发布版本都包含可用于测试的核心功能,兼容 XP 上的 ie6、7、8 和 Windows7 上的 ie9。
  使用
  WebDriver driver = new InternetExplorerDriver();
  优势
  运行在真实的浏览器中,并且支持 JavaScript,包括最终用户会碰到的一些怪异的问题。
  劣势
  显然它只在 Windows 系统上有效。
  相对较慢。
  Xpath 在很多版本中都是非原生支持。Sizzle 会注入到浏览器,这使得它比其他浏览器要慢很多,也比在相同的浏览器中使用 CSS 选择器要慢。
  IE 6、7 不支持 CSS 选择器,由 Sizzle 注入替代。
  IE 8、9 虽然原生支持 CSS 选择器,但它们不完全支持 CSS3.
  信息
  访问 Internet Explorer section of the wiki page 以获得更多新鲜信息。特别注意配置部分的内容。
  Chrome Driver
  Chrome Driver 由 Chromium 项目团队自己维护和支持。WebDriver 通过 chromedriver 二进制包(可以在 chromiun 的下载页面找到)来工作。你需要确保同时安装了某版本的 chrome 浏览器和 chromedriver。chromedriver 需要存放在某个指定的路径下使得 WebDriver 可以自动发现它。chromedriver 可以发现安装在默认路径下的 chrome 浏览器。这些都可以被环境变量覆盖。请查看 wiki 以获得更多信息。
  使用
  WebDriver driver = new ChromeDriver();
  优势
  ●运行在真实的浏览器中,并且支持 JavaScript。
  ●由于 chorme 是一个 webkit 内核的浏览器,Chrome Driver 能让你的站点在 Safari 中运行。注意自从 Chrome 使用了自己的 Javascript 引擎 V8 以后(之前是 Safari 的 Nitro 引擎),Javascript 的执行可能会一点不一样。
  劣势
  比 HtmlUnit 慢
  信息
  查看 wiki 以获得更多最新信息。更多信息可以在 下载页面 找到。
  运行 Chrome Driver
  下载 Chrome Driver 并参考 wiki 上的其他建议。
  Opera Driver
  查看 wiki
  iPhone Driver
  查看 wiki
  Android Driver
  查看 wiki
  可选择的后端:混合 WebDriver 和 RC 技术
  WebDriver-Backed Selenium-RC
  Java 版本的 WebDriver 提供了一套 Selenium-RC API 的实现。这意味着你可以使用 WebDriver 技术底层的 Selenium-RC API。这从根本上提供了向后兼容。这使得那些使用了 Selenium-RC API 的测试套件可以使用 WebDriver。这缓和了到 WebDriver 的迁移成本。同时,也允许你在同一个测试中使用两者的 API。
  Selenium-WebDriver 的用法如下:
  // 你可以使用任何 WebDriver 的实现,这里以 Firefox 的为例。
  WebDriver driver = new FirefoxDriver();
  // 基准 url,selenium 用于解析相对路径。
   String baseUrl = "http://www.google.com";
  // 创建一个 Selenium 实现。
  Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
  // 使用 selenium 进行一些操作。
  selenium.open("http://www.google.com");
  selenium.type("name=q", "cheese");
  selenium.click("name=btnG");
  // Get the underlying WebDriver implementation back. This will refer to the
  // same WebDriver instance as the "driver" variable above.
  WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver();
  // 最后,通过调用 WebDriverBackedSelenium 实例的 stop 方法关闭浏览器。
  // 应该避免使用 quit 方法,因为这样,在浏览器关闭后 jvm 还会继续运行。
  selenium.stop();
  优势
  允许 WebDriver 和 Selenium API 并存。
  提供了简单的机制从 Selenium RC API 迁移至 WebDriver。
  不需要运行 Selenium RC server。
  劣势
  没有实现所有的方法。
  一些高级用法可能无效(例如 Selenium Core 中的 “browserbot” 或其他内置的 js 方法)。
  由于底层的实现,有些方法会比较慢。
  Backing WebDriver with Selenium
  WebDriver 支持的浏览器数量没有 Selenium RC 多,所以如果希望使用 WebDriver 时获得更多的浏览器支持,你可以使用 SeleneseCommandExecutor。
  通过下面的代码,WebDriver 可以支持 safari(确保禁用弹出层):
  DesiredCapabilities capabilities = new DesiredCapabilities();
  capabilities.setBrowserName("safari");
  CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"), new URL("http://www.google.com/"), capabilities);
  WebDriver driver = new RemoteWebDriver(executor, capabilities);
  这种方案有一些明显的限制,特别是 findElements 不会如预期工作。同时,我们使用了 Selenium Core 来驱动浏览器,所以你也会受到 JavaScript 的沙箱限制。
  运行 Selenium Server 以使用 RemoteDrivers
  从 Selenium 下载页面 下载 selenium-server-standalone-.jar,你也可以选择下载 IEDriverServer。如果你需要测试 chrome,则从 google code 下载它。
  把 IEDriverServer 和 chromedriver 解压到某个路径,并确保这个路径在 $PATH / %PATH% 中,这样 Selenium Server 就可以不需要任何设置就能操作 IE 和 chrome。
  从命令行启动服务:
  java -jar <path_to>/selenium-server-standalone-<version>.jar
  如果你希望使用本地事件功能,在命令行添加以下参数:
  -Dwebdriver.enable.native.events=1
  查看帮助:
  java -jar <path_to>/selenium-server-standalone-<version>.jar -help
  为了运转正常,以下端口应该允许 TCP 请求链接:4444, 7054-5(或两倍于你计划并发运行的实例数量)。在 Windows 中,你可能需要 unblock 这个应用。
  更多资源
  你可以在 WebDriver wiki 找到更多有用的资源。
  当然,你可以在互联网上搜索到更多 Selenium 的话题,包括 Selenium-WebDriver’s drivers。有不少博客和众多论坛的帖子谈及到 Selenium。另外,Selenium 用户群组也是很重要的资源:http://groups.google.com/group/selenium-users。
  接下来
  本章节简要地从较高的层面介绍了 WebDriver 和其可信功能。一旦你熟悉了 Selenium WebDriver API 你可能会想要学习如何创建一个易于维护、可扩展的测试套件,并且提高哪些特性频繁修改的 AUT 的健壮性。大多数 Selenium 专家推荐的一种方式是:使用页面对象设计模式(可能是一个页面工厂)来设计你的测试代码。 Selenium WebDriver 在 Java 和 C sharp 中通过一个 PageFactory 类提供了这项支持。它同其他高级话题一样,将在下一章节讨论。同时,对于此项技术的较高层次的描述,你可以希望查看“测试设计考虑”章节。这两个章节都描述了如何通过模块化的思想使你的测试代码更易于维护。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号