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

时间:2022-09-07 09:58:54

一、操作弹出窗口

 

原理

在代码里, 通过 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类中自带方法, 可以进行显试等待的判断。

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

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

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

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

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 &lpar;十二&rpar; 操作弹出窗口

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

  2. java selenium &lpar;十三&rpar; 智能等待页面加载完成

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

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

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

  4. selenium&plus;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. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. c&num;部分---结构体再利用;

    //定义一个结构体,存放关于车辆的几个信息 //将所有车的信息都放入集合中 //车型号 价格(W) 轴距 (mm) 油耗(L/100km) //宝马320Li 38 2920 6.9 //宝马520L ...

  3. Python覆盖率分析工具&lowbar;Coverage

    easy_install安装: easy_install coverage 运行: coverage run test.py coverage report

  4. c&plus;&plus; primer复习(五):类

    一:基本内容 1 类 数据成员:用于存储与类对象相关联的状态 成员函数:对数据成员进行操作 类将接口与实现分离,接口指定了类支持的操作,操作的具体实现细节是类的设计者才需要了解 2 类成员 类成员可以 ...

  5. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  6. &lbrack;Linked List&rsqb;Delete Node in a Linked List

    otal Accepted: 48115 Total Submissions: 109291 Difficulty: Easy Write a function to delete a node (e ...

  7. PAT1022&period;&colon;Digital Library

    1022. Digital Library (30) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A Di ...

  8. 如何在CentOS 7中安装最新Git&lpar;源码安装&rpar;

    如何在CentOS 7中安装最新Git 2017年05月20日 11:49:53 阅读数:1624 Git是在今天的软件开发行业一个非常有用的版本控制工具.我一直使用Git.于是为Linux公社的读者 ...

  9. RabbitMQ 队列、消息持久化

    RabbitMQ的消息队列的持久化是一个很不错的功能,设置也非常简单.如下代码: 1.设置队列持久化(在声明队列的时候设置) channel.QueueDeclare(queue: "q.l ...

  10. Eclipse安卓插件安装

    首先说明下载的ADT专门真安卓开发的Eclipse下载下来后就集成了可以直接使用了 但是使用j2EE版本的Eclipse就需要安装插件支持安卓开发了 首先下载ADT Eclipse安卓插件 下载完成后 ...