1、什么情况下选用WebDriver?
(1)Selenium-1.0不支持的浏览器功能。
(2)multiple frames, multiple browser windows, popups, and alerts.
(3)页面导航。
(4)下拉。
(5)基于AJAX的UI元素。
2、WebDriver的几个实现:
Name of driver Available on which OS? Class to instantiate
HtmlUnit Driver All org.openqa.selenium.htmlunit.HtmlUnitDriver
Firefox Driver All org.openqa.selenium.firefox.FirefoxDriver
Internet Explorer Driver Windows org.openqa.selenium.ie.InternetExplorerDriver
Chrome Driver All org.openqa.selenium.chrome.ChromeDriver
(1)HtmlUnit Driver是纯java的驱动器,全部在内存中运行,不会实际打开浏览器,但其速度很快。
(2)Firefox Driver:速度慢。
3、WebDriver常用的函数接口(以HtmlUnitDriver为例)
WebDriver driver = new HtmlUnitDriver();
(1)页面导航 :
driver.get( "http://www.google.com" ); 完全装载页面后将控制返回给测试脚本。
注意:当页面又很多AJAX调用时,该接口无法确认页面是否完全装载,这是需要使用"waits"。
(2)与页面交互
例如:<input type= "text" name= "passwd" id= "passwd-id" />
WebElement element;
element = driver.findElement(By.id( "passwd-id" ));
element = driver.findElement(By.name( "passwd" ));
element = driver.findElement(By.xpath( "//input[@id=’passwd-id’]" ));
(XPATH返回第一个匹配到的元素,如果没有匹配到,抛出NoSuchElementException)
element.sendKeys( "some text" );
element.sendKeys( " and some" , Keys.ARROW_DOWN); (按向下箭头)
(任何页面元素都可以调用sendKeys,例如可以测试一些快捷方式键,键盘的每次输入都是附加在文本串的后面)
element.clear(); 清除文本域内容
4、填写表单
(1)处理SELECT标签:
WebElement select = driver.findElement(By.xpath( "//select" ));
List<WebElement> allOptions = select.findElements(By.tagName( "option" ));
for (WebElement option : allOptions) {
System.out.println(String.format( "Value is: %s" , option.getValue()));
option.setSelected();
}
(2)使用Select类处理SELECT标签:
Select select = new Select(driver.findElement(By.xpath( "//select" )));
select.deselectAll();
select.selectByVisibleText( "Edam" );
5、提交:
(1)driver.findElement(By.id( "submit" )).click();
(2)element.submit();(要求element必须在表单中,否则抛出NoSuchElementException)
6、检查元素是否在页面上(并且可以获取元素的尺寸和位置,拖拉元素):
WebElement plain = driver.findElement(By.name( "q" ));
RenderedWebElement element = (RenderedWebElement) element;(例如HtmlUnit Driver就无法显示出内容)
对元素拖拉:
RenderedWebElement element = (RenderedWebElement) driver.findElement(By.name( "source" ));
RenderedWebElement target = (RenderedWebElement) driver.findElement(By.name( "target" ));
element.dragAndDropOn(target);
7、在窗口和frame之间移动
(1)在命名的窗口之间移动:switchTo
driver.switchTo().window( "windowName" ); (可以通过js或者打开窗口的链接获取窗口名称)
(2)也可通过窗口句柄切换:
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
}
(3)frame之间切换或者切换到iframe:
driver.switchTo().frame( "frameName" );
通过索引访问subframe:
driver.switchTo().frame( "frameName.0.child" );(frameName的第一个subframe的明价child的frame)
8、弹出对话框:
窗口弹出后,可以使用如下语句访问到弹出窗口:
Alert alert = driver.switchTo().alert();
获取到alert窗口后,可进行各种操作。
9、页面导航:
navigate().to()和get()功能完全一样。
driver.navigate().to( "http://www.example.com" );
浏览器的前进和后退
driver.navigate().forward();
driver.navigate().back();
(注意这两个方法取决于浏览器的实现,可以会出现某些调用失败)
10、Cookies(必须首先在目标url域上)
// Go to the correct domain
driver.get( "http://www.example.com" );
// Now set the cookie. This one’s valid for the entire domain
Cookie cookie = new Cookie( "key" , "value" );
driver.manage().addCookie(cookie);
// And now output all the available cookies for the current URL
Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format( "%s -> %s" , loadedCookie.getName(), loadedCookie.getValue()));
}
12、WebDriver支持的浏览器不如Selenium RC多:
为了支持更多的浏览器并且使用WebDriver API,可以使用SeleneseCommandExecutor
Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName( "safari" );
CommandExecutor executor = new SeleneseCommandExecutor( "http:localhost:4444/" , "http://WebDriver driver = new RemoteWebDriver(executor, capabilities);
这种方法的限制条件:目前findElements方法不能使用,并且首先js沙盒。
(1)Selenium-1.0不支持的浏览器功能。
(2)multiple frames, multiple browser windows, popups, and alerts.
(3)页面导航。
(4)下拉。
(5)基于AJAX的UI元素。
2、WebDriver的几个实现:
Name of driver Available on which OS? Class to instantiate
HtmlUnit Driver All org.openqa.selenium.htmlunit.HtmlUnitDriver
Firefox Driver All org.openqa.selenium.firefox.FirefoxDriver
Internet Explorer Driver Windows org.openqa.selenium.ie.InternetExplorerDriver
Chrome Driver All org.openqa.selenium.chrome.ChromeDriver
(1)HtmlUnit Driver是纯java的驱动器,全部在内存中运行,不会实际打开浏览器,但其速度很快。
(2)Firefox Driver:速度慢。
3、WebDriver常用的函数接口(以HtmlUnitDriver为例)
WebDriver driver = new HtmlUnitDriver();
(1)页面导航 :
driver.get( "http://www.google.com" ); 完全装载页面后将控制返回给测试脚本。
注意:当页面又很多AJAX调用时,该接口无法确认页面是否完全装载,这是需要使用"waits"。
(2)与页面交互
例如:<input type= "text" name= "passwd" id= "passwd-id" />
WebElement element;
element = driver.findElement(By.id( "passwd-id" ));
element = driver.findElement(By.name( "passwd" ));
element = driver.findElement(By.xpath( "//input[@id=’passwd-id’]" ));
(XPATH返回第一个匹配到的元素,如果没有匹配到,抛出NoSuchElementException)
element.sendKeys( "some text" );
element.sendKeys( " and some" , Keys.ARROW_DOWN); (按向下箭头)
(任何页面元素都可以调用sendKeys,例如可以测试一些快捷方式键,键盘的每次输入都是附加在文本串的后面)
element.clear(); 清除文本域内容
4、填写表单
(1)处理SELECT标签:
WebElement select = driver.findElement(By.xpath( "//select" ));
List<WebElement> allOptions = select.findElements(By.tagName( "option" ));
for (WebElement option : allOptions) {
System.out.println(String.format( "Value is: %s" , option.getValue()));
option.setSelected();
}
(2)使用Select类处理SELECT标签:
Select select = new Select(driver.findElement(By.xpath( "//select" )));
select.deselectAll();
select.selectByVisibleText( "Edam" );
5、提交:
(1)driver.findElement(By.id( "submit" )).click();
(2)element.submit();(要求element必须在表单中,否则抛出NoSuchElementException)
6、检查元素是否在页面上(并且可以获取元素的尺寸和位置,拖拉元素):
WebElement plain = driver.findElement(By.name( "q" ));
RenderedWebElement element = (RenderedWebElement) element;(例如HtmlUnit Driver就无法显示出内容)
对元素拖拉:
RenderedWebElement element = (RenderedWebElement) driver.findElement(By.name( "source" ));
RenderedWebElement target = (RenderedWebElement) driver.findElement(By.name( "target" ));
element.dragAndDropOn(target);
7、在窗口和frame之间移动
(1)在命名的窗口之间移动:switchTo
driver.switchTo().window( "windowName" ); (可以通过js或者打开窗口的链接获取窗口名称)
(2)也可通过窗口句柄切换:
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
}
(3)frame之间切换或者切换到iframe:
driver.switchTo().frame( "frameName" );
通过索引访问subframe:
driver.switchTo().frame( "frameName.0.child" );(frameName的第一个subframe的明价child的frame)
8、弹出对话框:
窗口弹出后,可以使用如下语句访问到弹出窗口:
Alert alert = driver.switchTo().alert();
获取到alert窗口后,可进行各种操作。
9、页面导航:
navigate().to()和get()功能完全一样。
driver.navigate().to( "http://www.example.com" );
浏览器的前进和后退
driver.navigate().forward();
driver.navigate().back();
(注意这两个方法取决于浏览器的实现,可以会出现某些调用失败)
10、Cookies(必须首先在目标url域上)
// Go to the correct domain
driver.get( "http://www.example.com" );
// Now set the cookie. This one’s valid for the entire domain
Cookie cookie = new Cookie( "key" , "value" );
driver.manage().addCookie(cookie);
// And now output all the available cookies for the current URL
Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format( "%s -> %s" , loadedCookie.getName(), loadedCookie.getValue()));
}
12、WebDriver支持的浏览器不如Selenium RC多:
为了支持更多的浏览器并且使用WebDriver API,可以使用SeleneseCommandExecutor
Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName( "safari" );
CommandExecutor executor = new SeleneseCommandExecutor( "http:localhost:4444/" , "http://WebDriver driver = new RemoteWebDriver(executor, capabilities);
这种方法的限制条件:目前findElements方法不能使用,并且首先js沙盒。