一、操作弹出窗口

 

原理

在代码里, 通过 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. Java中使用 foreach 操作数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是" for 每一个& ...

  2. mysql8.0忘记密码如何操作?

    很不幸,刚安装了MYSQL8,由于密码验证方式的不同,自己折腾了一小会,不小心退出来了,进不去了.从网上面查了一下资料,好多都不是特别好使,最后摸索出来可以进行如下操作: 1. 在配置文件中设置将密码 ...

  3. asp.net core 系列之静态文件

    这篇讲解asp.net core中的静态文件(大致翻译于官网). 静态文件,例如HTML,CSS, images和JavaScript. 要想直接被客户端访问,需要做一些配置. 一.Serve sta ...

  4. PHP--数据库访问(增、删、改、查)

    练习通过数据库查询一个表,操作这个表的增.删.改.查的功能! 一.主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  5. vue项目目录结构详解

    项目简介基于 vue.js 的前端开发环境,用于前后端分离后的单页应用开发,可以在开发时使用 ES Next.scss 等最新语言特性.项目包含: 基础库: vue.js.vue-router.vue ...

  6. java并发笔记之证明 synchronized锁 是否真实存在

    警告⚠️:本文耗时很长,先做好心理准备 证明:偏向锁.轻量级锁.重量级锁真实存在 由[java并发笔记之java线程模型]链接: https://www.cnblogs.com/yuhangwang/ ...

  7. IO流总结1

    一.什么是流? 流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由地控制文件.内存.IO设备等数据的流向. ...

  8. webstorm和git安装后,terminal输入git命令,提示'git' 不是内部或外部命令

    最近换了工作,拿到电脑重新搭建编程环境,踩了好多git和sourcetree的坑,就是一直拉不下来代码,晕·~~经过几天的爬坑,终于可以拉取推送代码了!!! 问题:webstorm和git都安装完成, ...

  9. HTTP文件上传原理

    前言 对于这块知识点,我一直都是模糊的,不是非常清楚的.在平时的工作中,遇到上传的问题,也没有深入的去研究过,也都是直接用别人封装好的类来完成自己的工作.某一天,看了本书,说到这个知识点,一脸茫然,觉 ...

  10. UIRefreshControl 问题

    这两天在学UIRefreshControl,主要参照的是github上的一个Demo(网址 https://github.com/evgeniymikholap/UIRefreshControlExa ...