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
答案 0 :(得分:1)
我相信可以为此使用XPath。您将需要使用XPath查找IFrame IWebElement,然后将IWebElement传递到SwitchTo()。Frame()
var ele = driver.FindElement(By.XPath("//iframe[contains(id, 'card-fields-number')]"));
driver.switchTo().frame(ele);
答案 1 :(得分:0)
您是否尝试使用driver.switchTo()。defaultContent();在switchTo.frame之前?
也许您还没有画完所有画框
driver.switchTo().defaultContent();
driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");
答案 2 :(得分:0)
我猜每次框架名称或ID都是动态的,在这种情况下,请使用索引来标识框架。
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();
}
希望这会有所帮助
答案 3 :(得分:0)
根据您共享的图像<iframe>
具有动态属性,因此必须定位并切换到所需的<iframe>
,
您可以使用以下任一解决方案:
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')]")));
在这里您可以找到有关Ways to deal with #document under iframe的相关讨论
答案 4 :(得分:0)
我的解决方案是寻找与不同动态ID完全相同的关键字。在这种情况下,它是“ card-fields-name”。我是通过使用XPath定位器来做到这一点的。
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));