提问者:小点点

如何切换多个帧使用硒和Java


我想发送密钥到卡号,到期日期和CVV文本字段在iframe。

现在我观察到的是,在测试用例中,我首先写入开关的哪个帧被定位,并且键被发送,其他两个被忽略。

在下面的代码中,我首先提到了到期日期帧,它位于但未找到卡帧,即cddnumber id帧。

cpp.fillintextfields.get(4).sendKeys("test@test.com");
WebElement es = driver1.findElement(By.id("CollectJSInlineccexp"));
driver1.switchTo().frame(es);
cpp.expdate.sendKeys("01/21");
driver1.switchTo().frame("CollectJSInlineccnumber");
Thread.sleep(2000);
cpp.cdnumber.sendKeys("4111111111111111");
Thread.sleep(5000);

现在,当我提到cddnumber时,即卡号帧首先如下面的代码所示,然后是到期日期帧,卡号帧被定位,到期日期帧未被定位。

cpp.fillintextfields.get(4).sendKeys("test@test.com");
driver1.switchTo().frame("CollectJSInlineccnumber");
Thread.sleep(2000);
cpp.cdnumber.sendKeys("4111111111111111");
Thread.sleep(5000);
WebElement es = driver1.findElement(By.id("CollectJSInlineccexp"));
driver1.switchTo().frame(es);
cpp.expdate.sendKeys("01/21");

以下是TestNG错误的痕迹,简而言之,当我在卡号帧之前提到到期日帧时:

org.openqa.selenium.NoSuchFrameException: No frame element found by name or id CollectJSInlineccnumber
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'KE5', ip: '10.6.6.105', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '10.0.2'
Driver info: driver.version: unknown
    at org.openqa.selenium.remote.RemoteWebDriver$RemoteTargetLocator.frame(RemoteWebDriver.java:885)

请帮助我,并建议我解决这个问题的任何解决方案,以便即使我一个接一个地写它们,也可以找到所有的帧。


共1个答案

匿名用户

当您需要在同一父框架的两个子框架(例如顶级框架)之间切换时,您需要切换到defaultContent,这是页面上的第一个框架,或者是页面包含iframe时的主文档,然后切换到第二个子框架,如下所示:

>

  • 第一个代码块:

    cpp.fillintextfields.get(4).sendKeys("test@test.com");
    WebElement es = driver1.findElement(By.id("CollectJSInlineccexp"));
    driver1.switchTo().frame(es);
    cpp.expdate.sendKeys("01/21");
    driver1.switchTo().defaultContent();
    Thread.sleep(2000);
    driver1.switchTo().frame("CollectJSInlineccnumber");
    Thread.sleep(2000);
    cpp.cdnumber.sendKeys("4111111111111111");
    

    第二个代码块:

    cpp.fillintextfields.get(4).sendKeys("test@test.com");
    driver1.switchTo().frame("CollectJSInlineccnumber");
    Thread.sleep(2000);
    cpp.cdnumber.sendKeys("4111111111111111");
    Thread.sleep(5000);
    driver1.switchTo().defaultContent();
    WebElement es = driver1.findElement(By.id("CollectJSInlineccexp"));
    driver1.switchTo().frame(es);
    cpp.expdate.sendKeys("01/21");
    

    您可以在以下链接中找到一些相关的讨论:

    • 多个iframe标签Selenium网络驱动程序