登录类型的弹窗,应该如何捕捉?

登录类型的弹窗,应该如何捕捉?_第1张图片

问题描述,看博文摘要,问题解决会在博客上发布

问题已经解决了,但是,这个博客为何没有任何人留言,没有任何人前来解答,感觉,哪怕是互联网,也是我一个人在奋战,不需要你们有多么厉害,一定会有答案,但是,连句留言都没有。。。算了不说这些了 ,公布答案吧。

package com.TestNG.Selenium;

import org.openqa.selenium.*;
import org.openqa.selenium.firefox.*;
import org.openqa.selenium.WebDriver.*;

public class Jd {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        System.setProperty("webdriver.firefox.bin","D:\\软件\\浏览器\\firefox\\firefox.exe");
        WebDriver driver=new FirefoxDriver();
        
        driver.get("http://search.jd.com/Search?keyword=2269&enc=utf-8"); //填写链接
//        driver.findElement(By.cssSelector(".p-name")).click();               //点击商品
        driver.findElement(By.partialLinkText("AOC I2269VW 21.5英寸LED背光超窄边框IPS广视角液晶显示器")).click();    
        driver.findElement(By.partialLinkText("AOC I2269VW 21.5英寸LED背光超窄边框IPS广视角液晶显示器")).click();    
        String[] handle=new String[driver.getWindowHandles().size()];
        driver.getWindowHandles().toArray(handle);
        driver.switchTo().window(handle[2]);
//        driver=switchWindow(driver,"【AOCI2269VW】");                        //跳转页面
        Thread.sleep(5000);
        driver.findElement(By.cssSelector("#InitCartUrl>b")).click();     //点击【加入购物车】
        driver.findElement(By.cssSelector("#GotoShoppingCart")).click();  //点击【进入购物车结算】
        driver.findElement(By.cssSelector("#toSettlement>b")).click();    //点击【去结算】
        WebElement iframeWindow=driver.findElement(By.xpath(".//*[@id='thickconr']/iframe"));//xpath捕捉窗口元素
        driver.switchTo().frame(iframeWindow);

          //css捕捉窗口元素,css无法定位可能是我css学的不够好,写错了
//          WebElement iframeWindow=driver.findElement(By.cssSelector("#thickconr>ifrane"));     
//          driver.switchTo().frame(iframeWindow);

        driver.findElement(By.cssSelector("#loginname")).sendKeys("123546");
        driver.findElement(By.cssSelector("#nloginpwd")).sendKeys("123456");
        driver.findElement(By.cssSelector("#loginsubmitframe")).click();
    }
}

这是之前找到的一个方法: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, 查找要获得的页面元素。

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

登录类型的弹窗,应该如何捕捉?_第2张图片

 

这个页面中, 要想获得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";
        }

但是这个属于寻找未知的窗口,我的窗口是可见的,于是我多浪费了好几天;

由此得到的教训是:什么问题,先从简单的方法去解答,对了就可以剩下很多时间,错了,只是用了一点点的时间。。


你可能感兴趣的:(窗口捕捉,登录弹窗)