无法在 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()

仅供参考:首先始终检查您的定位器并确保它们是正确的。