IWebDriver.SwitchTo().Frame(IWebElement frame)

如果一个页面是一个html元素, 只有一个head, 一个body, 那么使用IWebDriver.FindElement()查找页面中的任何一个元素都没有问题。但是,由于页面中<frame ... 的使用,使得一个原始的html页面中可以包含多个子html页面, 在这种情况下,使用IWebDrivr.FindElement()查找页面 某个元素,如果元素是属于元素大的html的, 那么没有问题。若该元素是属于某个子的<frame ...下的,获得页面元素会失败的。要想成功,首先要弄清楚该元素所属的frame的, 其次, 将IWebDriver切换到该frame, 然后再使用IWebDriver.FindElement()查找这个元素。

1. 获得页面元素所属于的frame, 拿到它的name属性。

2. 使用IWebDriver.FindElements()获得本页面中所有的frame, 使用ByTagName。

3. 循环遍历所有Frame,查找name属性相符的Frame。

4. 将IWebDriver焦点切换到该Frame, 查找要获得的页面元素。

例如, 我的页面元素如下:

这个页面中, 要想获得id是"testcategory"的span元素, 直接使用IWebDriver.FindElement(By.ID("testcategory"))是没有用的, 找不到这个element。

正确的代码如下:

using Se = OpenQA.Selenium;
using SIE = OpenQA.Selenium.IE; SIE.InternetExplorerDriver driver = new SIE.InternetExplorerDriver();
// all frames
IList<Se.IWebElement> frames = driver.FindElements(Se.By.TagName("frame"));
Se.IWebElement controlPanelFrame = null;
foreach (var frame in frames)
{
if (frame.GetAttribute("name") == "ControlPanelFrame")
{
controlPanelFrame = frame;
break;
}
} if (controlPanelFrame != null)
{
driver.SwitchTo().Frame(controlPanelFrame);
} // find the spane by id in frame "ControlPanelFrame"
Se.IWebElement spanElement = driver.FindElement(Se.By.Id("testcategory"));

IWebDriver.SwitchTo().Window(string windowName)

在页面上点击一个button, 然后打开了一个新的window, 将当前IWebDriver的focus切换到新window,使用IWebDriver.SwitchTo().Window(string windowName)。

例如, 我点击按钮以后弹出一个名字叫做"Content Display"的window, 要切换焦点到新窗口的方法是, 首先,获得新window的window name, 大家不要误以为page tile就是window name 哦, 如果你使用driver.SwitchTo().Window("Content Display")是找不到window name 叫做"Content Display"的窗口的, 其实Window Name 是一长串数字,类似“59790103-4e06-4433-97a9-b6e519a84fd0”。

要正确切换到"Content Display"的方法是:

1. 获得当前所有的WindowHandles。

2. 循环遍历到所有的window, 查找window.title与"Content Display"相符的window返回。

大家明白了吧, 正确的代码:

using Se = OpenQA.Selenium;
using SIE = OpenQA.Selenium.IE; public static string GoToWindow(string title, ref SIE.InternetExplorerDriver driver)
{
driver.SwitchTo().DefaultContent(); // get all window handles
IList<string> handlers = driver.WindowHandles;
foreach (var winHandler in handlers)
{
driver.SwitchTo().Window(winHandler);
if (driver.Title == title)
{
return "Success";
}
else
{
driver.SwitchTo().DefaultContent();
}
} return "Window Not Found";
}

Selenium - IWebDriver.SwitchTo() frame 和 Window 的用法的更多相关文章

  1. Selenium Webdriver——操作隐藏的元素(三)switchTo().frame()

    在web 应用中经常会遇到frame 嵌套页面的应用,页WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的.这个时候就需要通过switc ...

  2. Selenium - IWebDriver 控制scroll bar到底部

    有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉 ...

  3. window.opener用法

    [转]window.opener用法 window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open(&quo ...

  4. window.onload用法详解:

    网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代 ...

  5. 网站开发进阶(十三)window.onload用法详解

    window.onload用法详解 网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本 ...

  6. js window.location用法

    <script> //设置或获取 href 属性中跟在问号后面的部分. console.log(window.location.search)//设置或获取对象指定的文件名或路径conso ...

  7. [转]window.opener用法

    window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html" ...

  8. python selenium中iframe切换、window切换方法

    一.selenium中iframe切换方法: 方法一:switch_to.frame frame函数中提供了三种定位方法:by index, name, or webelement. driver.s ...

  9. Selenium(六):frame切换、窗口切换

    1. 切换到frame index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

随机推荐

  1. Tengine vs openresty

      简介 Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到 ...

  2. 求平均排序MATLAB code

    A0=R(:,1:2:end); for i=1:17 A1=A0(i,:); p=sort(unique(A1)); for j=1:length(p) Rank0(A1==p(j))=j; end ...

  3. 碰到sshd连接不上linux时的解决办法

    1,首先更改ssh配置,可以是ssh端口连接不上服务器 cd /etc/ssh/sshd_config vi !$ Port 52113 //ssh默认的连接端口, 改为别人不知道的端口 Permit ...

  4. 尽量少用Include

    当我们使用EF写查询,尤其是关联到多个表的时候,我们一般习惯使用include关联,但是过多地使用include会带来性能问题.作为替代方法,可以使用多个toList来代替. 改造前:

  5. 编写自己的Windows Live Writer插件

    起因 自从小猪使用Windows Live Writer(wlw)来写博客之后就很少打开网站的后台编辑器了,这真是个写博客的好东西啊,但是任何东西都是不完美的.索契冬奥会开幕式都会把五环弄成四环呢!对 ...

  6. GUID

    前言 全局唯一标识符,简称GUID(发音为 /ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA ...

  7. MyEclipse10.X 的破解过程详细图解

    http://wenku.baidu.com/view/423e95056c85ec3a87c2c512.html

  8. Google十大惊人产品

    国外资讯网站BusinessInsider刊文细数了谷歌惊世骇俗的十大产品,范围从无人驾驶汽车到太空电梯再到高空风力发电,每一项都令人无限神往,充满未来感. 以下是谷歌十大惊人产品: 众所周知,谷歌并 ...

  9. elasticsearch插件之一:bigdesk

    bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况,http连接数等. 可用项目git地址:https:// ...

  10. Android事件处理--读书笔记

    2013-12-28 17:57:17 1. Android提供了两种方式的事件处理:基于回调和基于监听的事件处理: 1.1 对基于监听的事件处理而言,主要做法是为Android界面组件绑定特定的事件 ...