Selenium 无法定位 iframe
Selenium can't locate iframe
Selenium 无法通过 ID
和 Name
找到 iframe。
这是针对 Shopify 的自动结账测试。具体问题出在支付领域。我找到了 iframe
的 ID 和名称,即 card-fields-number-b1kh6njydiv00000
。
iframe 图片:
文本字段图像:
代码试验:
driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");
错误是:
org.openqa.selenium.NoSuchFrameException: No frame element found by name or id card-fields-number-b1kh6njydiv00000
您是否尝试使用 driver.switchTo().defaultContent();在 switchTo.frame 之前?
也许你并没有出局
driver.switchTo().defaultContent();
driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");
我猜每个框架名称或 ID 都是动态的 time.In 这种情况下使用索引来识别框架。
int size = driver.findElements(By.tagName("iframe")).size();
for(int i=0; i<=size; i++){
driver.switchTo().frame(i);
//Do necessary operation here.
driver.switchTo().defaultContent();
}
希望对您有所帮助
我相信可以为此使用 XPath。您将需要使用 XPath 找到 IFrame IWebElement,然后将 IWebElement 传递到 SwitchTo().Frame()
var ele = driver.FindElement(By.XPath("//iframe[contains(id, 'card-fields-number')]"));
driver.switchTo().frame(ele);
根据您分享的图像,<iframe>
具有动态属性,因此要找到并切换到所需的 <iframe>
,您必须:
- 诱导 WebDriverWait 以获得所需的 框架并切换到它.
您可以使用以下任一解决方案:
cssSelector:
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe.card-fields-iframe[id^='card-fields-number-'][src*='shopifycs']")));
xpath:
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@class='card-fields-iframe' and starts-with(@id,'card-fields-number-')][contains(@src, 'shopifycs')]")));
Here you can find a relevant discussion on
我的解决方案是寻找对于不同的动态 ID 完全相同的关键字。在这种情况下,它是 "card-fields-name"。我使用 XPath 定位器完成了此操作。
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));
Selenium 无法通过 ID
和 Name
找到 iframe。
这是针对 Shopify 的自动结账测试。具体问题出在支付领域。我找到了 iframe
的 ID 和名称,即 card-fields-number-b1kh6njydiv00000
。
iframe 图片:
文本字段图像:
代码试验:
driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");
错误是:
org.openqa.selenium.NoSuchFrameException: No frame element found by name or id card-fields-number-b1kh6njydiv00000
您是否尝试使用 driver.switchTo().defaultContent();在 switchTo.frame 之前?
也许你并没有出局
driver.switchTo().defaultContent();
driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");
我猜每个框架名称或 ID 都是动态的 time.In 这种情况下使用索引来识别框架。
int size = driver.findElements(By.tagName("iframe")).size();
for(int i=0; i<=size; i++){
driver.switchTo().frame(i);
//Do necessary operation here.
driver.switchTo().defaultContent();
}
希望对您有所帮助
我相信可以为此使用 XPath。您将需要使用 XPath 找到 IFrame IWebElement,然后将 IWebElement 传递到 SwitchTo().Frame()
var ele = driver.FindElement(By.XPath("//iframe[contains(id, 'card-fields-number')]"));
driver.switchTo().frame(ele);
根据您分享的图像,<iframe>
具有动态属性,因此要找到并切换到所需的 <iframe>
,您必须:
- 诱导 WebDriverWait 以获得所需的 框架并切换到它.
您可以使用以下任一解决方案:
cssSelector:
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe.card-fields-iframe[id^='card-fields-number-'][src*='shopifycs']")));
xpath:
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@class='card-fields-iframe' and starts-with(@id,'card-fields-number-')][contains(@src, 'shopifycs')]")));
Here you can find a relevant discussion on
我的解决方案是寻找对于不同的动态 ID 完全相同的关键字。在这种情况下,它是 "card-fields-name"。我使用 XPath 定位器完成了此操作。
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));