Selenium - IWebDriver.SwitchTo() frame 和 Window 的用法

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"。

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

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 的用法

时间: 2024-10-28 21:51:34

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

Selenium - IWebDriver 控制scroll bar到底部

有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉到最下方.    要操作的页面元素不在吸视范围,无法进行操作,需要拖动滚动条 其实,实现这个功能只要一行代码,但由于不懂js ,所以花了不小力气找到这种方法. 用于标识滚动条位置的代码 <body onload= "document.body.scrollTop=0 "> &l

window.opener用法

[转]window.opener用法 window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html"),那么在subform.html中 window.opener 就代表parentForm,可以通过这种方式设置父窗体的值或者调用js方法. 如:1,window.opener.test(); ---调用父窗体中的test()方法 2,如果window.opener存

window.onload用法详解

window.onload用法详解: 网页中的javascript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的低端,这样在运行脚本代码的时候,可以确保要操作的对象已经加载完成. 二.通过window.onload来执行脚本代码. 第一种方式感觉比较凌乱(其实推荐使用),往往我们需要将脚本代码放在一个更为合适的地方,那么window.onload方式就是一个更好的选择.window.onloa

[转]window.showModalDialog以及window.open用法简介

一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法:window.open(pageURL,name,parameters) 其中:pageURL 为子窗口路径 name 为子窗口句柄 parameters 为窗口参数(各参数用逗号分隔) 三.示例:<SCRIPT> <!-- window.open ('page.html','newwindow','height=100,width=400,

[转]window.opener用法

window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html"),那么在subform.html中 window.opener 就代表parentForm,可以通过这种方式设置父窗体的值或者调用js方法. 如:1,window.opener.test(); ---调用父窗体中的test()方法 2,如果window.opener存在,设置parentForm中stoc

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

一.selenium中iframe切换方法: 方法一:switch_to.frame frame函数中提供了三种定位方法: driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0]) 以腾讯课堂为例: from selenium import webdriver from time

UI中 frame 与 transform的用法与总结

在iOS中,我们是不可以直接访问控件中frame的结构体的成员的,因此我们需要分三步来改变一个UI控件的位置,大小 一.frame用法 frame的结构体类型为: struct CGRect { CGPoint origin; CGSize size; }; 定义中间变量接收,然后赋值    //得到button控件的frame赋值为自定义变量 CGRect frame= self.btnImage.frame;    //修改结构体变量   frame.origin.y-=10;    //重

C#中通过Selenium IWebDriver实现人人网相册备份工具

我用Selenium写了一个人人网相册备份工具,亲测通过. 需要输入你的用户名.密码.相册地址. 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenQA.Selenium; using OpenQA.Selenium.IE; using OpenQA.Selenium.Interact

【selenium自动化——定位frame中的对象】

页面上有 A.B 两个 frame,其中 B 在 A 内,那么定位 B 中的内容则需要先到 A,然后再到 B. switch_to_frame 方法可以把当前定位的主体切换到 frame 里 代码示例: from selenium import webdriverimport time...... driver.implicitly_wait(30)#先找到到 ifrome1(id = f1)driver.switch_to_frame("f1")#再找到其下面的 ifrome2(id