zoukankan      html  css  js  c++  java
  • selenium 多窗口(windows)及ITargetLocator使用总结

    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

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

    个人号

  • 相关阅读:
    HDU
    POJ
    POJ
    POJ
    POJ
    POJ
    POJ
    SPFA算法——最短路径
    POJ1251 Jungle Roads Kruskal+scanf输入小技巧
    MongoDB--关于数据库及选择MongoDB的原因
  • 原文地址:https://www.cnblogs.com/hchengmx/p/10793092.html
Copyright © 2011-2022 走看看