无法在 IFrame (Selenium) 中定位元素
Not able to locate an element within the IFrame (Selenium)
所以我已经创建了将卡添加到我的个人资料的成功测试,现在我想验证是否添加了卡所以我想检查是否出现了“您的卡已成功添加”文本,但是对于某种找不到类名的原因。
这是一个 iframe,但我确实输入它来添加卡详细信息并提交它们,所以试图了解为什么它无法找到以下内容:
正在添加卡片
public void addCard(Card card) {
switchToCardIframe()
.fillInCardNumber(card.getCardNumber())
.fillInCardHolder(card.getCardHolderName())
.fillInExpiryDate(card.getExpiryDate())
.fillInCvv(card.getCvv())
.clickOnToggle()
.clickOnAddButton();
}
这就是我定位文本的方式
@FindBy(css = "payment-state-message")
private WebElement cardAddedIndicator;
测试
@Test
public void shouldSuccessfullyAddCard() {
myCards.addCard(cardData());
assertTrue(myCards.getCardAddedIndicator().isDisplayed());
}
我也曾尝试通过转义 iframe 来检查是否显示了另一个元素,但没有成功,所以感谢您的帮助
driver.switchTo().defaultContent()
我也尝试了 Thread.sleep() 10 秒,然后才从 css 定位器获取文本,但不是运气
这里是等待初始化的基页
public class BasePage {
public WebDriver driver;
protected Wait wait;
public BasePage(WebDriver driver) {
initializePage(driver);
this.wait = new Wait(driver);
}
final protected void initializePage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(new AjaxElementLocatorFactory(driver, 20), this);
}
}
你的 css 是错误的,所以
@FindBy(css = "payment-state-message")
private WebElement cardAddedIndicator;
试试这个
@FindBy(css = ".payment-state-message")
private WebElement cardAddedIndicator;
也不检查 .isDisplay
的可见性
而是调用一个文本方法。也放一些delay/wait。
String actualMessage = myCards.getCardAddedIndicator().getText();
String expectedMessage = "Your card was successfully added"
然后根据它们的实际和预期行为断言这两个。
结论:
当有 iframe
表单并提交时,并不意味着它仍然是相同的 iframe
。在我的例子中,当我提交表单时 iframe
消失了但是为了找到元素我必须执行 driver().switch().parentFrame()
仅供参考:首先始终检查您的定位器并确保它们是正确的。
所以我已经创建了将卡添加到我的个人资料的成功测试,现在我想验证是否添加了卡所以我想检查是否出现了“您的卡已成功添加”文本,但是对于某种找不到类名的原因。
这是一个 iframe,但我确实输入它来添加卡详细信息并提交它们,所以试图了解为什么它无法找到以下内容:
正在添加卡片
public void addCard(Card card) {
switchToCardIframe()
.fillInCardNumber(card.getCardNumber())
.fillInCardHolder(card.getCardHolderName())
.fillInExpiryDate(card.getExpiryDate())
.fillInCvv(card.getCvv())
.clickOnToggle()
.clickOnAddButton();
}
这就是我定位文本的方式
@FindBy(css = "payment-state-message")
private WebElement cardAddedIndicator;
测试
@Test
public void shouldSuccessfullyAddCard() {
myCards.addCard(cardData());
assertTrue(myCards.getCardAddedIndicator().isDisplayed());
}
我也曾尝试通过转义 iframe 来检查是否显示了另一个元素,但没有成功,所以感谢您的帮助
driver.switchTo().defaultContent()
我也尝试了 Thread.sleep() 10 秒,然后才从 css 定位器获取文本,但不是运气
这里是等待初始化的基页
public class BasePage {
public WebDriver driver;
protected Wait wait;
public BasePage(WebDriver driver) {
initializePage(driver);
this.wait = new Wait(driver);
}
final protected void initializePage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(new AjaxElementLocatorFactory(driver, 20), this);
}
}
你的 css 是错误的,所以
@FindBy(css = "payment-state-message")
private WebElement cardAddedIndicator;
试试这个
@FindBy(css = ".payment-state-message")
private WebElement cardAddedIndicator;
也不检查 .isDisplay
而是调用一个文本方法。也放一些delay/wait。
String actualMessage = myCards.getCardAddedIndicator().getText();
String expectedMessage = "Your card was successfully added"
然后根据它们的实际和预期行为断言这两个。
结论:
当有 iframe
表单并提交时,并不意味着它仍然是相同的 iframe
。在我的例子中,当我提交表单时 iframe
消失了但是为了找到元素我必须执行 driver().switch().parentFrame()
仅供参考:首先始终检查您的定位器并确保它们是正确的。