记录一些学习Selenium 过程中遇到的问题.
(1) 通过页面JS 是否加载完成来判断页面加载
方法1.
public void waitForPageLoad(WebDriver driver, String timeout) {
WebDriverWait wait = new WebDriverWait(driver, Long.parseLong(timeout));
wait.until(isPageLoaded());
}
/**
* wait until page load successfully.
* @return true: page loads successfully.
*/
protected Function<WebDriver, Boolean> isPageLoaded() {
return new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
if(((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete")){
System.out.println("Page load:" + ((JavascriptExecutor) driver).executeScript("return document.readyState"));
}
return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
};
}
方法2.
if (driver instanceof JavascriptExecutor) {
Object obj = ((JavascriptExecutor)driver).executeScript("return document.readyState");
System.out.println(obj);
}
(2) 可以用Action 类来实现鼠标的模拟操作.
例如实现鼠标的悬浮(MouseOver)动作:
public void mouseOver(WebDriver driver, String element) throws InterruptedException{
WebElement toElement = driver.findElement(By.id(element));
Actions action = new Actions(driver);
action.moveToElement(toElement).bulid().perform();
Thread.sleep(10000);
}
WebDriver 实现浏览器窗口的切换. 从这里 .转载
当测试页面同时出现2个或者以上窗口时候,而且新打开的window没有name,可以使用driver.switchTo().window(winHandleID)来进行切换
//Store the current window handle
String winHandleBefore = driver.getWindowHandle();
//Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
System.out.println("+++" + winHandle);
driver.switchTo().window(winHandle);
}
// Close the original window
driver.switchTo().window(winHandleBefore);
driver.close();
//Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
System.out.println("+++" + winHandle);
driver.switchTo().window(winHandle);
}
当最后只有一个窗口剩下的时候,应该可以直接使用
driver.switchTo().window(driver.getWindowHandle)
去选中新的窗口
当有两个窗口的时候, 要关闭第一个窗口保持第二个窗口开启, 可以先保存两窗口的handle. 然后再关闭.
String winHandleBefore = driver.getWindowHandle();
System.out.println("++++" + winHandleBefore);
for(String handle : driver.getWindowHandles()){
System.out.println("++++ handle : " + handle);
driver.switchTo().window(handle);
}
String windHandleAfter = driver.getWindowHandle();
System.out.println("++++windHandleAfter" + windHandleAfter);
driver.switchTo().window(winHandleBefore).close();
driver.switchTo().window(windHandleAfter);
或者:
String winHandleBefore = driver.getWindowHandle();
String windHandleAfter = null;
System.out.println("++++" + winHandleBefore);
baseOperation.clickAndWait(driver, suggest_product);
for(String winHandle : driver.getWindowHandles()){
System.out.println("++++" + winHandle);
if(winHandle.equals(winHandleBefore)){
continue;
}else{
windHandleAfter = winHandle;
driver.switchTo().window(winHandle);
break;
}
}