当我访问我的 iframe 时,当我使用 selenium 时,#document 不显示

Posted

技术标签:

【中文标题】当我访问我的 iframe 时,当我使用 selenium 时,#document 不显示【英文标题】:When i acces my Iframe the #document doesnt show when i use selenium 【发布时间】:2021-12-24 19:02:40 【问题描述】:

我正在尝试使用 selenium 中的虚拟数据通过信用卡付款。 我遇到的问题是,当我手动运行我的 selenium 代码时,#document 不显示,它只在我刷新页面后显示,但是当我尝试在 selenium 中做同样的事情时,即使页面刷新了#文档不显示。

由 selenium 完成的 html

<body class="script-body">
<div class="container"></div>
<script type="text/javascript"></script>
<iframe src="https://libs.hipay.com/hostedfields/index.html#type=card&amp;element=controller&amp;instanceId=200803&amp;referrer=https://stage-secure-gateway.hipay-tpp.com" frameborder="0" allowtransparency="true" scrolling="no"   name="hipay-controller-200803" title="hipay-controller-200803" id="hipay-controller-200803" data-hipay-id="hostedfield-iframe"></iframe>
</body>

当我手动操作时:

我的代码:

WebElement ClkPaiementByCard = driver.findElement(By.id("payed-cart"));
js.executeScript("arguments[0].click();", ClkPaiementByCard);
driver.findElement(By.className("script-body")).sendKeys(Keys.F5);
WebElement CardNumber = driver.findElement(By.xpath(
        "//div[@id=\"root\"]/div/div/form/div/div/input[@name=\"cardnumber\"]"));
CardNumber.clear();
CardNumber.sendKeys("4111 1111 1111 1111");
WebElement ExpDate = driver.findElement(By.xpath(
        "//div[@id=\"root\"]/div/div/input[@name=\"cc-exp\"]"));
ExpDate.clear();
ExpDate.sendKeys("05/24");
WebElement CVC = driver.findElement(By.xpath(
        "//div[@id=\"root\"]/div/div/input[@name=\"cvc\"]"));
CVC.clear();
CVC.sendKeys("123");            
WebElement SubmitPaiement = driver.findElement(By.id("submit-button"));
js.executeScript("arguments[0].click();", SubmitPaiement);

我尝试执行switchto().frame(),但它始终不起作用

【问题讨论】:

【参考方案1】:

iframe 清晰可见。您需要先切换到iframe 才能访问元素,如下所示:

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[starts-with(@id, 'hipay-controller') and @data-hipay-id='hostedfield-iframe']")));

最好使用WebDriverWait,如下:

new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@id, 'hipay-controller') and @data-hipay-id='hostedfield-iframe']")));

【讨论】:

对不起,我的主要问题是我不明白这个开关会做什么,如果你能解释它是否会访问#document,即使它没有在 HTML 中显示? 我得到这个错误 org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: "method":"xpath","selector":"//div[@id= “root”]/div/div/form/div/div/input[@name="cardnumber"]" 并且当我将 xpath 放在元素控制台中时,它找不到,因为一旦我刷新 #document 就没有显示它显示 当您尝试与iframe 中的元素进行交互时,org.openqa.selenium.NoSuchElementException 听起来像是一个新错误。您可能想提出一个包含所有相关细节的新问题。 正如我在这个问题中所说的,这个错误的原因是当你第一次访问页面时 #document 不存在,所以即使他切换到框架中,他也没有什么可以选择的因为那里什么都没有,所以我提出的最后一个问题已关闭,所有相关问题都没有针对我的问题的答案。 重新阅读您对此讨论的问题和我的回答。如果#document 不存在driver.switchTo().frame() 将不会成功。有一些方法可以对抗 org.openqa.selenium.NoSuchElementException,这超出了本问题的范围。

以上是关于当我访问我的 iframe 时,当我使用 selenium 时,#document 不显示的主要内容,如果未能解决你的问题,请参考以下文章

为啥只有当我从 iframe 调用 postMessage() 方法时我的 Angular 属性才会更新

在iframe中获取移动版本

从 iframe 访问 Firefox 扩展程序

从另一个页面访问时无法访问的链接

iframe如何在chrome扩展中访问父窗口

从 iframe 到 ajax 的会话