1. selenium能实现窗口切换的原理

有些网页应用可能有很多的frame或者windows。那么selenium是如何区别不同的windows的呢? 它是这样做的, 一旦实例化webdriver对象,selenium的webdriver就会给每个窗口分配一个string字符串id,这个id叫做这个该窗口的句柄,每个窗口都有唯一的id,所以selenium就可以在不同的窗口间实现切换。

ps: 刷新整个页面以后,id会变化。

2. 常见命令

2.1 WindowHandle

目的: 获取当前句柄

string handble = driver.WindowHandle

2.2 WindowHandles

目的: 获取当前打开的所有句柄

ReadOnlyCollection<string> allHandles = driver.WindowHandles;

2.3 SwtichTo

根据string切换到另外一个句柄

public void SwitchWindowsHandle(IWebDriver driver, string currentHandles)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
ReadOnlyCollection<string> allHandles = driver.WindowHandles;
wait.Until((_driver) => { return _driver.WindowHandles.Count != 1; });
foreach (string handle in allHandles)
{
if (handle != currentHandles)
{
driver.SwitchTo().Window(handle);
}
}
}

3. 使用JavaScript切换窗口

selenium只能得到窗口,切换窗口,但是要是我们想要新建一个窗口,并且输入一个已知的url,该如何显示? 这个时候就要用到JavaScript来进行补充。

IJavaScriptExecutor jscript = driver as IJavaScriptExecutor;
jscript.ExecuteScript("window.open()"); List<string> handles = driver.WindowHandles.ToList<string>();
driver.SwitchTo().Window(handles.Last());
driver.Navigate().GoToUrl(url);

4. 还能SwitchTo什么

我在用SwitchTo().Windows()时候发现, SwitchTo返回的是一个ITargetLocator类型的对象。就研究了一下ITarget是什么。

根据Selenium官网的介绍,一共可以返回八种类型的东西。

1.ActiveElement:

返回当前聚焦的元素,这个可以通过tab键来看,focus的元素通常都会被文本框圈出来。

2.Alert

返回当前active的Alert

3.DefaultContent()

返回页面中的第一个frame 或者 让页面有iframe的时候返回主页面。

driver.switchTo.frame("Frame_ID");   //从主页面切换到frame
driver.switchTo().defaultContent(); //从frame切到回到主页面

4.Frame(Int32)

根据index切换frame

driver.SwitchTo().Frame(0);

5.Frame(String)

根据frame的name或者id定位

6.Frame(IWebElement)

通过已经找到的IWebElment元素切换

IWebElement iframePart = driver.FindElement(By.ClassName(iframeClassName));
driver.SwitchTo().Frame(iframePart);

7.ParentFrame

选择当前选择的frame的parent, 要注意和SwitchTo()DefaultContent()的区别,一个是parent,一个是最顶级的。

8.Window

切换window


参考资料:

  1. Selenium WebDriver Switch Window Commands
  2. OpenQA_Selenium_ITargetLocator
  3. how-to-switch-between-frames-in-selenium-webdriver-using-java
  4. what-is-the-difference-between-driver-switchto-parentframe-and-driver-switch/51105138#51105138

本文希望对您有所帮助,如何问题可联系我的个人微信

selenium 多窗口(windows)及ITargetLocator使用总结的更多相关文章

  1. Python+selenium自动化测试中Windows窗口跳转方法

    Python+selenium自动化测试中Windows窗口跳转方法 #第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 drive ...

  2. Python3 Selenium多窗口切换

    Python3 Selenium多窗口切换 以腾讯网(http://www.qq.com/)为例,打开腾讯网,点击新闻,打开腾讯新闻,点击新闻中第一个新闻链接. 在WebDriver中封装了获取当前窗 ...

  3. Python+Selenium学习--窗口切换及操作元素

    场景 有时候我们在测试一个web 应用时会出现多个浏览器窗口的情况,在selenium1.0 中这个问题比较难处理.webdriver 提供了相关相方法可以很轻松的在多个窗口之间切换并操作不同窗口上的 ...

  4. selenium webdriver窗口切换(上)

    selenium webdriver窗口切换,有时候在做自动化的时候需要打开很多很多的页面, 当在操作不同的页面的时候需要切换窗口,下面是如何切换到前后页面窗口的操作: package test201 ...

  5. selenium 多窗口切换(windows)

    在web应用中,常常会遇见点击某个链接会弹出一个新的窗口,或者是相互关联的web应用 ,这样要去操作新窗口中的元素,这时就需要主机切换到新窗口进行操作..WebDriver 提供了switchTo() ...

  6. 转:Selenium Grid+JAVA +Windows 配置(Selenium 2.0)

    Selenium-Grid 允许你在多台机器的多个浏览器上并行的进行测试,也就是说,你可以同时运行多个测试.本质上来说就是,Selenium-Grid 支持分布式的测试执行.它可以让你的测试在一个分布 ...

  7. python3 selenium 切换窗口的几种方法

    第一种方法: 使用场景: 打开多个窗口,需要定位到新打开的窗口 使用方法: # 获取打开的多个窗口句柄windows = driver.window_handles# 切换到当前最新打开的窗口driv ...

  8. selenium webdriver窗口切换(下)

    多窗口切换有时候需要在不同的窗口切换,从而操作不同的窗口上的元素.在selenium1.0 中这个问题比较难处理.但WebDriver 提供了switcTo.window()方法可以切换到任意的窗口. ...

  9. selenium 切换窗口的几种方法

    第一种方法: 使用场景: 打开多个窗口,需要定位到新打开的窗口 使用方法: # 获取打开的多个窗口句柄 windows = driver.window_handles # 切换到当前最新打开的窗口 d ...

随机推荐

  1. 浅说Java反射机制

    工作中遇到,问题解决: JAVA语言中的反射机制: 在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法? 对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的 ...

  2. 版本控制-https svn服务器搭建和常用命令(centos 6.3)

    Svn是比较优秀的版本控制工具,虽然功能和性能上无法和Git媲美,但由于其容易搭建和使用的特性,所以在各个小公司还是很受欢迎的.使用Git可参考<版本控制-Git服务器搭建和常用命令使用> ...

  3. 网页渗透-wpscan

    wpscan –url www.xxx.com #扫描基本信息 wpscan –url www.xxx.com –enumerate p #扫描插件基本信息 wpscan –url www.xxx.c ...

  4. WPF学习资源整理

    WPF(WindowsPresentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型 ...

  5. Panda3d code in github

    https://github.com/panda3d/panda3d [ref files] http://www.panda3d.noie.name/ https://www.panda3d.org ...

  6. ubuntu eclipse 集成pyDev

    Eclipse help 选择安装新软件 添加一个pydev 名字随意.地址是 http://pydev.org/updates. 下面的列表会出现很多PyDev For Eclipse 选择版本最高 ...

  7. Spring Boot - Spring Scheduling

    有时应用需要定时(如凌晨)执行一些任务(比如计算一些数据并存下来留给后续使用) 使用 使用@EnableScheduling注解启用Scheduling功能:不一定要标注在启动类上,也可以标注在@Co ...

  8. Spring Boot - Spring Cache

    缓存 服务器自身(内存)的缓存 利用java程序中的变量 简单 集群环境中多个实例无法共享同步 缓存服务器(一般支持集群.分布式) Redis Memcached Spring中使用注解使用缓存 启动 ...

  9. 201621123012 《Java程序设计》第11周学习总结

    作业11-多线程 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread ...

  10. MySQL大数据高并发处理之-查询的优化

    http://www.php1.cn/Content/MySQL_DaShuJuGaoBingFaChuLiZhi_-_ChaXunDeYouHua.html