如果测试脚本的所有元素在IE中都不能识别,但在别的浏览器中又没有问题,尝试检查IE的设置:IE>Internet Options>Security, 四个Zone的protected Mode需要设置一致(all disable or enable)。如果IE的安全级别设置较高,需要都disable。
讲了解决方案,说一下我理解的原理。这要从Selenium2的原理说起。
Selenium 1 (Selenium RC) 包括launcher,Http Proxy,Selenium core。 其中Selenium Core由JS函数组,通过Selenium server嵌入浏览器中,以实现用程序对浏览器操作。
Selenium 2 WebDriver提供了另外一种方式与浏览器进行交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器的原生API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现存在不同程度的差异,这就要求Selenium WebDriver要分浏览器厂商的不同,提供不同的实现,例如Chrome有专门的ChromeDriver,Firefox有FirefoxDriver等等。这也是为什么在run selenium的测试脚本的机器上我们需要有各种browser的driver。
回到我们最初的问题,为什么需要对IE设置Security下的四个zone都用一致的保护模式?
自从 IE7 引入 Protected Mode 以来, IE 浏览器的安全性的确得到了一定程度的提高。其原理从本质来讲,在浏览某些需要启用保护模式的页面时,会开启一个新的浏览器会话以完成任务,而此时你无法控制前一个会话中的 COM 对象。随之而来的问题是,WebDriver 在这种情况下会遇到如下错误提示信息:
org.openqa.selenium.WebDriverException:Unexpectederror launching
InternetExplorer.Protected Mode must be set to the same value(enabled or disabled) forall zones.
有的时候是更为有指导性的报错:
解决方案1:
可通过设置 Internet Explorer 浏览器对应所有 Zone 的Protected Mode 一致来达到目标。Zone 包括Internet、Local intranet、Trusted sites 和 Restricted sites。这4个 Zone 上的选项 Enable Protected Mode 要么全部勾选,要么全部不勾选
解决方案2:(此方法摘抄于网络,我没有实操过)
解决方案1对于只有少量的 Windows 测试机器而言具有可行性。而对于具有大规模的 Windows 测试机器的机构而言,去设置每一台 Windows 机器上的 Internet Explorer 的 Protected Mode 的工作量过于庞大。有没有更加高效的解决方案来达到同样的效果呢个?答案是通过设置 Internet Explorer Driver 的 Capability 为 IE_ENSURE_CLEAN_SESSION 达到目的。示例代码如下:
public classtestInternetExplorerDriver{
public staticvoid main(String[] args){
System.setProperty("webdriver.ie.driver","D:\Driver\IEDriverServer_Win32_2.37.0_latest\IEDriverSer.exe");
DesiredCapabilitiescapab = DesiredCapabilities.internetExplorer();
capab.setCapability(InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION,true);
capab.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
WebDriverdriver = new InternetExplorerDriver(capab);
driver.get("http://www.baidu.com");
}
}