切换到帧有时会失败(5次中有4次)。不改变任何代码

时间:2015-11-17 08:49:10

标签: selenium frames

Set<String> windows2 = w.getWindowHandles();
            System.out.println(windows2.size());
            for(String handles : windows2)
            {
                w.switchTo().window(handles);
            }
            System.out.println("Windows after itteration : "+windows2.size());
            Thread.sleep(2000);
            System.out.println(w.getTitle());
            w.switchTo().frame(w.findElement(By.xpath("//frame[@name='MainFrame1']")));
            w.findElement(By.name("blnggrp")).click();
            w.switchTo().defaultContent();
            Thread.sleep(2000);
            Set<String> windows3 = w.getWindowHandles();
            System.out.println(windows3.size());
            for(String hanldes : windows3)
            {
                w.switchTo().window(hanldes);
            }
            Thread.sleep(2000);
            w.switchTo().frame(w.findElement(By.xpath("//frame[@name='code_desc']")));
            w.findElement(By.name("resulted_cond")).click();
            w.switchTo().defaultContent();
  

错误:线程“main”中的异常   org.openqa.selenium.NoSuchElementException:无法找到元素   使用xpath == // frame [@ name ='code_desc']

2 个答案:

答案 0 :(得分:0)

不要使用Thread.sleep(),而是尝试使用等待。有两种类型 - 隐式等待和显式等待。您可以从here了解有关它的更多信息。

现在尝试删除所有Thread.sleep()语句并设置隐式等待驱动程序,然后执行代码:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

答案 1 :(得分:0)

我将使用的解决方案是WebDriver的driver.switchTo()。frame()方法,但避免索引号(您使用窗口句柄和ID的组合)w.switchTo().window(handles);是你错误的失败的原因。您可以删除它并选择您想要使用的窗口;

  • 一个数字。 (基于0的索引通常但不总是使用IE)
  • 姓名或 ID。
  • 以前找到的WebElement。

一个例子:

driver.switchTo().frame(driver.findElement(By.name("blnggrp")));

正如杰森所建议的那样,如果你把它与隐含的等待结合起来,你就会得到最好的解决方案

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));