首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Selenium VS Webdriver(2)

Selenium VS Webdriver(2)

Selenium vs WebDriver从上述用 Selenium 和 WebDriver 构建的两个测试工程来看,WebDriver 工程在构建之后不需要其他的配置我们便可以直接使用,这一点和 Selenium 是截然不同的。因为 Selenium 还需要安装并启动 Selenium Server 才能运行测试程序。
另外,我们可以看出 WebDriver 是基于面向对象的 API,它更多的是从用户角度出发。反之 Selenium 提供的是基于字典的 API,用户可以很方便的看到所以支持的方法。毋庸置疑的是,WebDriver 提供的 API 更为简洁,对用户更加的友好。但从另一个角度来看,就是用户不能很直观的看到 WebDriver 提供了哪些 API,可能需要通过官网提供的 JavaDoc(来源: )的协助来找寻一些方法。
    下面我们看下 WebDriver 支持的浏览器类型,以及一些基本操作的使用方法。
支持的浏览器
Selenium 是由一堆 JavaScript  实现的,所以只要支持 JavaScript  的浏览器 Selenium 都可以做到很好的支持,理论上来讲它比 WebDriver 能支持更多的浏览器而且不需要做额外的开发。但是因为每个浏览器对于 JavaScript  的执行有着不同程序的安全限制,以防止用户被恶意攻击,所以 Selenium 存在一些不能处理的情况,例如本机的鼠标和键盘事件,弹出框等等。WebDriver 则通过不同的方法来解决 Selenium 面临的一些问题,不单单使用 JavaScript ,WebDriver 会使用任何一种合适的机制来操作浏览器。WebDriver 提供了 、 、 、  、SafariDriver、HtmlUnitDriver,以及 RemoteWebDriver 来支持不同的浏览器。另外为了支持移动设备它提供了   和  。其中很特别的是 HtmlUnitDriver,它的无界面实现不会实际打开浏览器,运行速度很快,所以用户可以使用它来做一些单元测试。对于用 FireFox 或 Internet Explorer 等浏览器来做测试的自动化测试用例,运行速度通常很慢,HtmlUnit Driver 无疑是可以很好地解决这个问题。
那么既然 Selenium 和 WebDriver 支持的浏览器差不多,我们究竟应该选择 Selenium 还是 WebDriver 呢?虽然现在 WebDriver 还在处在开发和测试当中,有些功能还存在一些缺陷,但随着 Webdriver 的不断完善,它替代 Selenium 终将是大势所趋。所以笔者还是建议选择使用 WebDriver,如果确实 WebDriver 还不能支持你的测试工作,用 Selenium 来做一个过渡也是可以的。当然选用不同的测试工具可能对代码维护有一定的挑战,毕竟 Selenium 和 WebDriver 的 API 是不同的,幸好 WebDriver 还提供了另外一种方法。例如在笔者现在的项目中要支持 Safari,但是使用 SafariDriver 测试时非常的不稳定以致测试不能顺利的进行。所以使用了 SeleneseCommandExecutor,这种方法也可以让 WebDriver 支持更多的浏览器并还是使用 WebDriver API,这样也会降低维护代码的工作量。需要注意的是,这种方法需要安装并启动 Selenium Server。
清单 3. 使用 SelenseCommandExecutor 使 WebDriver 支持更多的浏览器
1
2
3
4
Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName( "safari" );
CommandExecutor executor = new SeleneseCommandExecutor( "http:localhost:4444/",/
  "http://WebDriver driver = new RemoteWebDriver(executor, capabilities);




定位页面元素
Selenium 对元素的处理是基于 Action,Object(操作,对象)的方式,使用 id、name,或是 XPath 来定位页面元素。当使用的是 XPath 时在某种程度上对 Internet Explorer 的测试速度有很大的影响,因为 IE 浏览器没有内置对 XPath 的支持,所以在 IE 上测试时会特别慢,当然现在已经有办法解决这个问题了,虽然比不上 Firefox 的测试速度但也是有了相当大的提高。
WebDriver 则使用 findElement 方法来查找到页面元素,它定位页面元素可以通过 id、name、xpath、className、link text、CSS 等等查找。
表 1. WebDriver 查找页面元素[td]
查找方式描述举例 (Java)
By.id以元素的 id 属性来定位页面元素By.id(“username”)
By.name以元素的 name 属性来定位页面元素By.name(“username”)
By.xpath以 XPath 来定位页面元素By.xpath(“//*[@id="username"])
By.className以元素的 class 属性来定位页面元素By.className(“even-table-row”)
By.cssSelector基于 CSS 选择器引擎定位页面元素By.cssSelector(“#username”)
By.LinkText
By.partialLinkText
查找包含链接字串的页面元素By.linkText(“Click Me!”)
By.partialLinkText(“ck M”)
By.TagName以元素的标签名称查找页面元素By.tagName(“td”)

有人研究过,By CSS 方式是最快的查找方式,所以在做测试时,我们可以尽量使用 By.cssSelector 的方式。(来源: )
页面等待
    在 Web UI 的自动化测试中,一种常见的不稳定是页面上的元素加载时间不固定,比如在 Ajax,或者 JS 延迟加载等情况下,页面元素出现的时间短的几毫秒,长的几秒钟。这个时候在读取页面元素就会一些麻烦。等得时间短了话找不到页面元素,测试 fail;但等得时间过长,又会增加测试的时间造成效率低下。
    在 Selenium 中,用户只能估算一个时间使用 Selenium.waitForPageToLoad()或者 Thread.sleep()的方式来等待页面加载时间,要不就是使用自己写的 Wait 方法,比如:
清单 4. 使用 Selenium API 的脚本 – 等待页面元素加载
1
2
3
4
5
6
7
8
9
public static void WaitForElementPresent(String elementName)
{
    int maxTry = 60;
if(selenium.isElementPresent(elementName))return;
for (int second = 0; second < maxTry; second++)
        {
if (selenium.isElementPresent(elementName))  break;
Thread.sleep(1000); //等待一秒钟
    }




但在 Webdriver 中,它提供了 Explicit and Implicit Waits 方法,使得等待的方法更加灵便使用,在下面的例子就是一个封装好的等待页面加载的方法,在 20 秒钟内等待页面元素出现,如果超过 20 秒就会抛出超时异常:
清单 5. 使用 WebDriver API 的脚本 – 等待页面元素加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public boolean waitForElementDisplayed(WebElement el, boolean shouldBeDisplayed) {
boolean displayed = false;
if (shouldBeDisplayed) {
try {
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(visibilityOfElementLocated(el));
displayed = true;
} catch (Exception e) {
displayed = false;
            }
} else {
try {
            displayed = el.isDisplayed();
} catch (NoSuchElementException e) {
displayed = false;
            }
        }
return displayed;
    }




更多关于 Explicit and Implicit Waits 的内容,请参考
返回列表