【问题标题】:How to switch between multiple frames using Selenium and Java如何使用 Selenium 和 Java 在多个帧之间切换
【发布时间】:2020-05-21 14:46:30
【问题描述】:

我想将密钥发送到 iframe 中的卡号、到期日期和 CVV 文本字段。

现在我观察到的是,在测试用例中,无论我先写哪个帧来切换,都会发送密钥,而忽略其他两个。

在下面的代码中,我首先提到了到期日期框架,但没有找到卡框架,即 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)

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

【问题讨论】:

    标签: java selenium selenium-webdriver iframe frame


    【解决方案1】:

    当您需要在同一个parent frame 的两个子框架(例如顶级框架)之间切换时,您需要切换到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");
      

    参考文献

    您可以在以下位置找到一些相关讨论:

    【讨论】:

    • @PratikPathare 很高兴能为您提供帮助。 Upvote 如果此/任何答案对您/对您有帮助,则为未来读者的利益提供答案。
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多