【问题标题】:How to Handle great grand child windows in selenium webdriver如何在 selenium webdriver 中处理曾孙窗口
【发布时间】:2017-05-31 08:44:44
【问题描述】:

在我的应用程序中,我正在处理曾孙窗口。 Windows以递归方式出现,例如窗口A->单击A->打开窗口B->单击B->打开C窗口->单击C窗口->打开窗口D。 因此,我将窗口存储在 List 中并使用 if、else if 条件以便可以保持插入,但在执行代码时,有时它会切换到所有窗口,有时它不会切换到曾孙窗口。我的代码如下所述。

public class DDE_finnone {


WebDriver driver;
WebDriverWait wait;
String app_id= "1894562";

@BeforeTest
public void setupapplication(){

    File filepath = new File("C:\\Automation_Softwares\\IEDriverServer\\IEDriverServer.exe");

    System.setProperty("webdriver.ie.driver", filepath.getAbsolutePath());

    driver = new InternetExplorerDriver();

    java.util.ResourceBundle.clearCache();

    wait = new WebDriverWait(driver, 20);

    driver.get("http://retail.herofincorp.com:7031/finnsso/gateway/SSOGateway?requestID=7000002");
}

@Test
public void DDE() throws Throwable{

    driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);

    /*---------------------------------- CAS MAIN SCREEN ------------------------*/

    List<String> browsertabs = new ArrayList<String>(driver.getWindowHandles());

    System.out.println(browsertabs);

    driver.switchTo().window(browsertabs.get(0));

    driver.findElement(By.name("TxtUID")).sendKeys("testname");

    driver.findElement(By.name("TxtPWD")).sendKeys("Testpwd");

    driver.findElement(By.name("DataAction")).click();

    // Screenshotpath = fn_screenshot(Screenshotpath);

    try {

        if (wait.until(ExpectedConditions.alertIsPresent()) != null) {

            String alertmessage = driver.switchTo().alert().getText();

            System.out.println(alertmessage);

        }
    } catch (NoAlertPresentException e) {
        e.printStackTrace();
    }

    // Screenshotpath = fn_screenshot(Screenshotpath);

    driver.switchTo().alert().accept();

    driver.findElement(By.name("btnCAS")).click();

    driver.switchTo().window(browsertabs.get(0));

    /*-------------------------- Retail Screen ----------------------*/

    List<String> FinnoneCAS1 = new ArrayList<String>(driver.getWindowHandles());

    Collections.sort(FinnoneCAS1);

    System.out.println(FinnoneCAS1);

    driver.switchTo().window(FinnoneCAS1.get(0));

    String title5 = driver.getTitle();

    System.out.println(title5);

    if (driver.getTitle().equalsIgnoreCase("Finnone SSO")) {

        driver.switchTo().window(FinnoneCAS1.get(1));

        System.out.println(driver.getTitle());
    }

    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frameForwardToApp"));

    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("banner"));

    WebElement areasection = driver.findElement(By.id("selBranch"));

    areasection.clear();

    Thread.sleep(1000);

    areasection.sendKeys("delhi");

//  Thread.sleep(2000);

    areasection.sendKeys(Keys.TAB);

    Thread.sleep(3000);

//  Screenshotpath = fn_screenshot(Screenshotpath);

    driver.switchTo().parentFrame();

    driver.switchTo().frame("contents");

    Actions move_AutoLoan1 = new Actions(driver);

    WebElement Auto_loan1 = driver.findElement(By.linkText("Auto Loan"));

    move_AutoLoan1.moveToElement(Auto_loan1).build().perform();

    WebElement DDEsearch = driver.findElement(By.linkText("Detail Data Entry"));

    wait.until(ExpectedConditions.visibilityOf(DDEsearch));     

//  WebElement allsearch = driver.findElement(By.linkText("All"));

//  wait.until(ExpectedConditions.visibilityOf(allsearch));

    DDEsearch.click();

    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("main"));

    WebElement searchappId = driver.findElement(By.id("txtApplication"));

    wait.until(ExpectedConditions.visibilityOf(searchappId));

    // Excel should start

    searchappId.sendKeys(app_id);

//  Screenshotpath = fn_screenshot(Screenshotpath);

    Thread.sleep(1000);

    WebElement searchbtn = driver.findElement(By.name("btnSearch"));

    wait.until(ExpectedConditions.visibilityOf(searchbtn));

    searchbtn.click();

    WebElement linkappid = driver.findElement(By.xpath("//table[@class='TABLEATTRIBUTES']/tbody/tr[2]/td[1]/a"));

    wait.until(ExpectedConditions.visibilityOf(linkappid));

    linkappid.click();

    driver.switchTo().window(FinnoneCAS1.get(0));   

    System.out.println(driver.getTitle());


    /*-------------- DDE ------------------------------------*/

    List<String> DDEscreen = new ArrayList<String>(driver.getWindowHandles());

    Collections.sort(DDEscreen);

    System.out.println(DDEscreen);

    driver.switchTo().window(DDEscreen.get(2));

    System.out.println(DDEscreen.get(2));

    String title2 = driver.getTitle();

    System.out.println(title2);

    if (title2.equalsIgnoreCase("Finnone SSO")) {

        driver.switchTo().window(DDEscreen.get(1));

        System.out.println(driver.getTitle());

    } else if (driver.getTitle().equalsIgnoreCase("Finnone CAS")) {

        driver.switchTo().window(DDEscreen.get(0));

        System.out.println(driver.getTitle());
    }

    WebElement demographic = driver.findElement(By.id("apy_b0i2text"));

    wait.until(ExpectedConditions.visibilityOf(demographic));

    demographic.click();

    WebElement customername = driver.findElement(By.xpath("//table[@class='TABLEATTRIBUTES']/tbody/tr[2]/td[1]/a"));

    wait.until(ExpectedConditions.visibilityOf(customername));

    customername.click();

    WebElement personaltab = driver.findElement(By.id("apy_b1i1font"));

    wait.until(ExpectedConditions.visibilityOf(personaltab));

    System.out.println(personaltab.getText());

    WebElement qualification = driver.findElement(By.id("selEduQualification"));

    wait.until(ExpectedConditions.visibilityOf(qualification));

    qualification.sendKeys("Graduate");

    qualification.sendKeys(Keys.TAB);

    /*------------ Education window ------------*/

    List<String> educationwindow = new ArrayList<String>(driver.getWindowHandles());

    Collections.sort(educationwindow);

    System.out.println(educationwindow);

    driver.switchTo().window(educationwindow.get(3));

    String title6 = driver.getTitle();

    System.out.println(title6);

    if (title6.equalsIgnoreCase("1894562-----NISHANT  OMAR")) {

        driver.switchTo().window(educationwindow.get(0));

        System.out.println(driver.getTitle());

    } else if (driver.getTitle().equalsIgnoreCase("Finnone SSO")) {

        driver.switchTo().window(educationwindow.get(1));

        System.out.println(driver.getTitle());

    } else if (driver.getTitle().equalsIgnoreCase("Finnone CAS")) {

        driver.switchTo().window(educationwindow.get(2));

        System.out.println(driver.getTitle());
    }

    WebElement searchcriteriaGo = driver.findElement(By.name("B1"));

    wait.until(ExpectedConditions.visibilityOf(searchcriteriaGo));

    searchcriteriaGo.click();

    driver.switchTo().window(educationwindow.get(0));

    /*-----------------Return from Education Window  -----------------------*/

    List<String> returneducationdetails = new ArrayList<String>(driver.getWindowHandles());

    Collections.sort(returneducationdetails);

    System.out.println(returneducationdetails);

    driver.switchTo().window(returneducationdetails.get(2));

    System.out.println(returneducationdetails.get(2));

    String title21 = driver.getTitle();

    System.out.println(title21);

    if (title21.equalsIgnoreCase("Finnone CAS")) {

        driver.switchTo().window(returneducationdetails.get(0));

        System.out.println(driver.getTitle());

    } else if (driver.getTitle().equalsIgnoreCase("Finnone SSO")) {

        driver.switchTo().window(returneducationdetails.get(1));

        System.out.println(driver.getTitle());
    }

}

【问题讨论】:

  • 您能否考虑提供以下信息: 1. Selenium 版本? 2. IEDriverServer 版本? 3. IE版本? 4. 错误堆栈跟踪。谢谢

标签: java eclipse selenium


【解决方案1】:

在 Selenium 中,Windows 中没有任何层次结构。父窗口和子窗口的命名只是为了我们的约定。但从 selenium 的角度来看,一切都只是另一个窗口。

下面的代码给出了一些想法,

//Get the current window address
Set<String> parent = driver.getWindowHandle();

//Get the all window addresses that are opened by selenium. This includes the parent window too
Set<String> all = driver.getWindowHandles();


//Assume this is the element you need to interact and it is present in some window.
String XPATH = ".//";

//Now iterate through all windows and search for the element you need to interact with.
for(String now:all)
{

    driver.switchTo().window(now);
    if(driver.findElements(By.xpath(XPATH)).size()>0)
    {
        System.out.println("Element found in the window "+now+ " "+driver.getTitle());
        //DO YOUR ACTUAL STUFF
    }
}

希望这对您有所帮助。谢谢。

【讨论】:

  • Thankyou Santhosh,但我认为 List 比 Sets 更可靠。
  • 对于窗口句柄... set 是首选,因为列表可能重复但 set 不会有任何重复。
  • 我同意列表可能会存储重复值,但对于 Windows .. 窗口 ID/代码将在运行时生成唯一的,因此当我们可以将窗口保存为列表时至少要维护 3 个以上的窗口插入和输出顺序,我的脚本正在使用此逻辑,但有时由于 7-8 个递归子窗口即将到来而失败。我使用了 Set 但它不像 List 那样工作,请提供另一种解决方案,以便可以始终成功执行相同的脚本。
  • 如果列表对您有好处...那么请继续...希望您的问题现在得到解决。
  • Santhosh,但它总是不处理曾孙窗口,我的查询未解决。请为我提供解决方案,以便每次执行都能 100% 成功执行。
最近更新 更多