一、操作弹出窗口

 

原理

在代码里, 通过 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. 洛谷 P1463、POI2002、HAOI2007 反素数

    题意: 求最小的$x\in[1,N]$,使得$x$为$g(x)$最大的数 中最小的一个. 分析: 1.$x$不会有超过$10$个不同质因子.理由:$2 \times 3\times 5...\time ...

  2. 洛谷P2790 ccj与zrz之积木问题 题解

    题目链接:https://www.luogu.org/problemnew/show/P2790 这题码量稍有点大... 分析: 这道题模拟即可.因为考虑到所有的操作vector可最快捷的实现,所以数 ...

  3. 个人永久性免费-Excel催化剂功能第102波-批量上传本地图片至网络图床(外网可访问)

    自我突破,在100+功能后,再做有质量的功能,非常不易,相对录制视频这些轻松活,还是按捺不住去写代码,此功能虽小,但功课也做了不少,希望对真正有需要的群体带来一些惊喜. 背景介绍 图床的使用,一般是写 ...

  4. Android 常用 Manager的总结

    Android 常用 Manager的总结 1 smsManager    发送短信 --使用方法         --SmsManager smsManager = SmsManager.getDe ...

  5. C#3.0新增功能10 表达式树 02 说明

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...

  6. python课堂整理6---字典

    一.字典  dict info = {"k1" : "v1", "k2" : "v2"} 以键值对形式组成字典 字典里的 ...

  7. React Hooks 深入系列 —— 设计模式

    本文是 React Hooks 深入系列的后续.此篇详细介绍了 Hooks 相对 class 的优势所在, 并介绍了相关 api 的设计思想, 同时对 Hooks 如何对齐 class 的生命周期钩子 ...

  8. &= 的含义

    这是一个缩略式子,展开之后的结果是a = a & b;&是按位与的操作符. 按位与运算:参加运算的两个数据,按二进位进行“与”运算.如果两个相应的二进位都为1,则该位的结果值为1,否则 ...

  9. memcached.c 源码分析

    上文分析了memcached的autoconf过程以及configure, make过程,可以看到,memcached可执行文件是由memcached-memcached.o以及其他文件连接后编译出来 ...

  10. 图像反转(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 获取像素值在[0, L]范围内的图像的反转图像,即为负片.适用于增强图像中白色或者灰色的区域,尤其当黑色在图片中占主地位时候 $$T(r) = L-r$$ 2. 运行结果 图源自ski ...