一、操作弹出窗口

 

原理

在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles();

来获取到所有弹出浏览器的句柄, 然后遍历, 使用swithcto.window(newwindow_handle)方法。 就可以定位到新的窗口。

测试页面的HTML

<html>

<head>

<title>常见web ui元素操作, 及API使用</title>

<script type="text/javascript">

function open_win()

{

window.open("http://www.cnblogs.com")

}

</script>

</head>

<body>

<form>

<input type=button value="打开窗口" onclick="open_win()">

</form>

</div>

</body>

</html>

Java 代码

public static void testMultipleWindowsTitle(WebDriver driver) throws Exception

{

String url="E:\\StashFolder\\huoli_28@hotmail.com\\Stash\\Tank-MoneyProject\\Selenium Webdriver\\AllUIElement.html";

driver.get(url);

// 获取当前窗口的句柄

String parentWindowId = driver.getWindowHandle();

System.out.println("driver.getTitle(): " + driver.getTitle());

WebElement button = driver.findElement(By.xpath("//input[@value='打开窗口']"));

button.click();

Set<String> allWindowsId = driver.getWindowHandles();

// 获取所有的打开窗口的句柄

for (String windowId : allWindowsId) {

if (driver.switchTo().window(windowId).getTitle().contains("博客园")) {

driver.switchTo().window(windowId);

break;

}

}

System.out.println("driver.getTitle(): " + driver.getTitle());

// 再次切换回原来的父窗口

driver.switchTo().window(parentWindowId);

System.out.println("parentWindowId: " + driver.getTitle());

}

二、智能等待页面加载完成

我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作。 否则页面上的元素不存在,会抛出异常。

或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操作。

selenium 中提供了非常简单,智能的方法,来判断元素是否存在。

实例要求

实例:set_timeout.html 下面的html 代码, 点击click 按钮5秒后, 页面上会出现一个红色的div快, 我们需要写一段自动化脚本智能的去判断这个div是否存在, 然后把这个div 然后高亮。

<html>

<head>

<title>Set Timeout</title>

<style>

.red_box { width = 20%; height: 100px; border: none;}

</style>

<script>

function show_div(){

setTimeout("create_div()", 5000);

}

function create_div(){

d = document.createElement('div');

d.className = "red_box";

document.body.appendChild(d);

}

</script>

</head>

<body>

<button id = "b" onclick = "show_div()">click</button>

</body>

</html>

隐式等待

WebDriver driver = new FirefoxDriver();

driver.get("file:///C:/Users/Tank/Desktop/set_timeout.html");

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

WebElement element = driver.findElement(By.cssSelector(".red_box"));

((JavascriptExecutor)driver).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);

其中

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

意思是, 总共等待10秒, 如果10秒后,元素还不存在,就会抛出异常。org.openqa.selenium.NoSuchElementException。

显式等待

显式等待 使用ExpectedConditions类中自带方法, 可以进行显试等待的判断。

显式等待可以自定义等待的条件,用于更加复杂的页面等待条件。

只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑

如果超过设定的最大显式等待时间阈值, 这测试程序会抛出异常。

public static void testWait2(WebDriver driver)

{

driver.get("E:\\StashFolder\\huoli_28@hotmail.com\\Stash\\Tank-MoneyProject\\浦东软件园培训中心\\我的教材\\Selenium Webdriver\\set_timeout.html");

WebDriverWait wait = new WebDriverWait(driver, 20);

wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".red_box")));

WebElement element = driver.findElement(By.cssSelector(".red_box"));

((JavascriptExecutor)driver).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);

}

三、处理 Iframe 中的元素

有时候我们定位元素的时候,发现怎么都定位不了。 这时候你需要查一查你要定位的元素是否在iframe里面。

什么是iframe?

iframe 就是HTML 中,用于网页嵌套网页的。 一个网页可以嵌套到另一个网页中,可以嵌套很多层。

Selenium 中提供了进入iframe 的方法

// 进入 id 叫frameA 的 iframe

dr.switchTo().frame("frameA");

// 回到主窗口

dr.switchTo().defaultContent();

main.html

<html>

<head>

<title>FrameTest</title>

</head>

<body>

<div id="id1">this is main page's div!</div>

<input type="text" id="maininput" />

<iframe id="frameA" frameborder="0" scrolling="no" style="left:0;position:absolute;" src="frame.html"></iframe>

</body>

</html>

frame.html

<html>

<head>

<title>this is a frame!</title>

</head>

<body>

<div id="div1">this is iframes div,</div>

<input id="iframeinput"></input>

</body>

</html>

selenium 代码

public static void testIframe(WebDriver driver)

{

driver.get("E:\\StashFolder\\huoli_28@hotmail.com\\Stash\\Tank-MoneyProject\\浦东软件园培训中心\\我的教材\\Selenium Webdriver\\frame\\main.html");

// 在 主窗口的时候

driver.findElement(By.id("maininput")).sendKeys("main input");

// 此时 没有进入到iframe, 以下语句会报错

//driver.findElement(By.id("iframeinput")).sendKeys("iframe input");

driver.switchTo().frame("frameA");

driver.findElement(By.id("iframeinput")).sendKeys("iframe input");

// 此时没有在主窗口,下面语句会报错

//driver.findElement(By.id("maininput")).sendKeys("main input");

// 回到主窗口

driver.switchTo().defaultContent();

driver.findElement(By.id("maininput")).sendKeys("main input");

}

Java Selenium (十二) 操作弹出窗口 & 智能等待页面加载完成 & 处理 Iframe 中的元素的更多相关文章

  1. java selenium (十二) 操作弹出窗口

    selenium 中如何处理弹出窗口 阅读目录 原理 在代码里, 通过         Set<String> allWindowsId = driver.getWindowHandles ...

  2. java selenium (十三) 智能等待页面加载完成

    我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...

  3. 关于selenium的智能等待页面加载的问题

    我们经常会碰到用selenium操作页面上某个元素的时候,需要等待页面加载完成后,才能操作, 否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后,才能操作. 首 ...

  4. selenium+python登录登出百度,等待页面加载,鼠标定位

    #coding:gbk from selenium import webdriver from selenium.webdriver.common.keys import Keys from sele ...

  5. JS实现当前页弹出窗口,且页面变灰不可操作

    使用JS在当前页面在div中加载弹出窗口,并让当前页面变灰不可操作. 加载弹出窗口的div需将宽高设置成整个页面的大小,以覆盖当前页面的内容. opacity:0.6: 页面可见度设置为0.6(1为完 ...

  6. jquery Jbox 插件实现弹出窗口在修改的数据之后,关闭弹出窗口刷新父页面的问题

    http://blog.csdn.net/nsdnresponsibility/article/details/51282797 问题如题: 这里我们在父页面定义一个全局的变量来标识是否需要刷新父页面 ...

  7. 最完美解决方案:js弹出窗口关闭当前页面,而不弹出提示框

    该功能主要用于业务系统中的登录操作,登录后弹出全屏的业务系统主界面,而不需要工具栏.地址栏.菜单等功能. 之前针对不同浏览器找了无数种方法,包括网上能查到的所有方法,弹出的结果都不理想.结果有的IE6 ...

  8. 练习PopupWindow弹出框之实现界面加载的时候显示弹出框到指定的view下面--两种延迟方法

    今天在练习PopupWindow弹出框的时候,打算在界面加载的时候将弹出框展现出来并显示在指定的view下面. 初步方法是直接在OnResume方法里面直接执行showPopupWindows方法. ...

  9. selenium 等待页面加载完成

    一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...

随机推荐

  1. 跟着大彬读源码 - Redis 6 - 对象和数据类型(下)

    继续撸我们的对象和数据类型. 上节我们一起认识了字符串和列表,接下来还有哈希.集合和有序集合. 1 哈希对象 哈希对象的可选编码分别是:ziplist 和 hashtable. 1.1 ziplist ...

  2. Spring Boot2(十五):Shiro记住我rememberMe、验证码Kaptcha

    接着上次学习的<Spring Boot2(十二):手摸手教你搭建Shiro安全框架>,实现了Shiro的认证和授权.今天继续在这个基础上学习Shiro实现功能记住我rememberMe,以 ...

  3. 算法-一步步教你如何用c语言实现堆排序(非递归)

    看了左神的堆排序,觉得思路很清晰,比常见的递归的堆排序要更容易理解,所以自己整理了一下笔记,带大家一步步实现堆排序算法 首先介绍什么是大根堆:每一个子树的最大值都是子树的头结点,即根结点是所有结点的最 ...

  4. python3 读取文件-2

    1.脚本 from sys import argv script,filename = argv#以读的模式打开txt文件txt = open(filename,'r+')print ("t ...

  5. $.ajax()在IE9下的兼容性问题

    最近在主导一个项目,遇到了一点问题,跟大家分享一下. 最终bug解决方案的链接地址:http://stackoverflow.com/questions/5241088/jquery-call-to- ...

  6. httpclient信任所有证书解决SSLException:Unrecognized SSL message,plaintext connection

    在使用 HttpClient 工具调用第三方 Http 接口时报错 javax.net.ssl.SSLException:Unrecognized SSL message,plaintext conn ...

  7. Android通过辅助功能实现抢微信红包原理简单介绍

    简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...

  8. druid0.15.0安装方式

    Druid0.15.0安装文档 1 集群规划 Master包含Coordinator和Overlord,4核16G*2: data包含Historical和MiddleManager,16核64G*3 ...

  9. 佳木斯集训Day7

    毒瘤出题人!!! T2的题面和样例不一样,所以我挂了(没错这就是我写模拟写挂了的理由) T1 大水题,懒得解释了,五分钟AC #include <bits/stdc++.h> #defin ...

  10. DataPipeline丨DataOps理念与设计原则

    作者:DataPipeline CEO 陈诚 上周我们探讨了数据的「资产负债表」与「现状」,期间抛给大家一个问题:如果我们制作一个企业的“数据资产负债表”,到底会有多少数据是企业真正的资产? 数据出现 ...