Selenium 切换到帧有时会失败(5次中有4次)。不改变任何代码
错误:主线程中出现异常 org.openqa.selenium.NoSuchElementException:找不到元素 使用xpath==//frame[@name='code\u desc'] 尝试使用等待,而不是使用Thread.sleep。有两种类型-隐式等待和显式等待。你可以从中学到更多 现在,请尝试删除所有Thread.sleep语句,并设置隐式等待驱动程序,然后执行代码:Selenium 切换到帧有时会失败(5次中有4次)。不改变任何代码,selenium,frames,Selenium,Frames,错误:主线程中出现异常 org.openqa.selenium.NoSuchElementException:找不到元素 使用xpath==//frame[@name='code\u desc'] 尝试使用等待,而不是使用Thread.sleep。有两种类型-隐式等待和显式等待。你可以从中学到更多 现在,请尝试删除所有Thread.sleep语句,并设置隐式等待驱动程序,然后执行代码: Set<String> windows2 = w.getWindowHandles();
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();
我将使用的解决方案是WebDriver的driver.switchTo.frame方法,但避免使用窗口句柄和w.switchTo.windowhandles的ID组合的索引号;是你错误失败的原因。您可以删除该窗口并选择要使用的窗口 一个数字。通常基于0的索引,但不总是使用IE 名字或名字 身份证件 以前找到的WebElement。 例如:
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
正如Jason所建议的,如果您将此与隐式等待相结合,您将获得最佳解决方案
driver.switchTo().frame(driver.findElement(By.name("blnggrp")));
即使我使用隐式等待,它也会抛出这个错误,当我编译脚本5次而代码没有任何更改时,它只执行了一到两次,我不知道为什么其他测试失败。你的代码不工作。TimeSpan类在selenium中不可用。@chienua-我不太熟悉C。但我从文档中获得了该代码。这是你的电话号码。检查你的导入。在上面提到的代码中,它在任何情况下都不适合我。它抛出了一个错误,比如找不到element==nameblnggrp。首先我们应该提到框架名称,bcos my元素blnggrp位于框架名称MainFrame1中。因此,首先我们应该对窗口和框架进行控制,然后对元素进行控制。Rite?我的示例假设blnggrp是要切换到的框架/窗口上的唯一名称元素。如果可以,请使用ID作为标识符。我建议使用blnggrp,正如您的示例代码中所示。
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));