登陸類型的彈窗,應該如何捕捉?

問題描述,看博文摘要,問題解決會在博客上發佈css

問題已經解決了,可是,這個博客爲什麼沒有任何人留言,沒有任何人前來解答,感受,哪怕是互聯網,也是我一我的在奮戰,不須要大家有多麼厲害,必定會有答案,可是,連句留言都沒有。。。算了不說這些了 ,公佈答案吧。html

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

IWebDriver.SwitchTo().Frame(IWebElement frame)web

若是一個頁面是一個html元素, 只有一個head, 一個body, 那麼使用IWebDriver.FindElement()查找頁面中的任何一個元素都沒有問題。可是,因爲頁面中<frame ... 的使用,使得一個原始的html頁面中能夠包含多個子html頁面, 在這種狀況下,使用IWebDrivr.FindElement()查找頁面 某個元素,若是元素是屬於元素大的html的, 那麼沒有問題。若該元素是屬於某個子的<frame ...下的,得到頁面元素會失敗的。要想成功,首先要弄清楚該元素所屬的frame的, 其次, 將IWebDriver切換到該frame, 而後再使用IWebDriver.FindElement()查找這個元素。瀏覽器

1. 得到頁面元素所屬於的frame, 拿到它的name屬性。spa

2. 使用IWebDriver.FindElements()得到本頁面中全部的frame, 使用ByTagName。firefox

3. 循環遍歷全部Frame,查找name屬性相符的Frame。code

4. 將IWebDriver焦點切換到該Frame, 查找要得到的頁面元素。htm

例如, 個人頁面元素以下:blog

 

這個頁面中, 要想得到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";
        }

可是這個屬於尋找未知的窗口,個人窗口是可見的,因而我多浪費了好幾天;

由此獲得的教訓是:什麼問題,先從簡單的方法去解答,對了就能夠剩下不少時間,錯了,只是用了一點點的時間。。

相關文章
相關標籤/搜索