【问题标题】:SwitchTo IFrame where XPath contains part of an idSwitchTo IFrame,其中 XPath 包含 id 的一部分
【发布时间】:2017-12-15 12:09:05
【问题描述】:

所以当我单击一个按钮并尝试切换到这个 iframe 时,我会弹出一个 iframe。我面临的挑战是 iframe 的 ID 根据会话是动态的,因此我需要根据 id 的前缀切换到 iframe,无论如何都是相同的。

    public void StartMTATransaction(string date)
    {
        Transaction.Clear();
        Transaction.SendKeys("MTA");
        Go.Click();
        ObjectRepository.Driver.SwitchTo().Frame(ObjectRepository.driver.FindElement(By.XPath("//iframe[starts-with(@id,'dctPopup_dctPopupWindow') and contains(@name,'dctPopup_dctPopupWindow')]")));
        TransactionDate.SendKeys(date);
        ObjectRepository.driver.SwitchTo().DefaultContent();
    }

当我尝试运行代码时,第 2 行出现以下错误:

System.NullReferenceException: '对象引用未设置为对象的实例。'

我试图切换到的元素:

<iframe id="dctPopup_dctPopupWindow5D21CAC8BEAC0794DFC40B9D0081D49E" style="WIDTH: 100%; HEIGHT: 100%; BACKGROUND-COLOR: transparent" name="dctPopup_dctPopupWindow5D21CAC8BEAC0794DFC40B9D0081D49E" frameborder="0" width="100%" height="100%"></iframe>

【问题讨论】:

  • 你能显示HTML吗?

标签: c# selenium iframe xpath selenium-webdriver


【解决方案1】:

按照HTML切换到IFrame可以使用下面的代码块:

Go.Click();   
ObjectRepository.Driver.SwitchTo().Frame(ObjectRepository.driver.FindElement(By.XPath("//iframe[starts-with(@id,'dctPopup_dctPopupWindow')]")));
TransactionDate.SendKeys(date);

您还可以通过耦合name 属性来更精细:

Go.Click();   
ObjectRepository.Driver.SwitchTo().Frame(ObjectRepository.driver.FindElement(By.XPath("//iframe[starts-with(@id,'dctPopup_dctPopupWindow') and contains(@name,'dctPopup_dctPopupWindow')]")));
TransactionDate.SendKeys(date);

但根据最佳实践,我们应该将 WebDriverWait 诱导为IFrame 可用于切换,如下所示:

Go.Click();
_wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(6));
_wait.Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.XPath("//iframe[starts-with(@id,'dctPopup_dctPopupWindow') and contains(@name,'dctPopup_dctPopupWindow')]")));
TransactionDate.SendKeys(date);

【讨论】:

    【解决方案2】:

    尝试以下方法,您的 xpath 需要更正。

    Go.Click();   
    ObjectRepository.Driver.SwitchTo().Frame(ObjectRepository.driver.FindElement(By.XPath("//iframe[contains(@id, 'dctPopup_')]")));
    TransactionDate.SendKeys(date);
    

    正确的 xpath 是//iframe[contains(@id, 'dctPopup_')]

    【讨论】:

    • 我猜你需要等到框架被加载。在java中,有一个预期的条件,frametobeavailabelandswitchtoit。 IT 将等到帧被加载并切换到它。我不确定在 C# 中
    【解决方案3】:

    也可以使用 css 选择器:

    iframe[id*='dctPopup']
    

    如果您想坚持使用 xpath,请尝试:

    //iframe[contains(@id, 'dctPopup')]
    

    【讨论】:

    • 使用其中任何一个仍然显示相同的错误消息
    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2012-11-28
    • 1970-01-01
    • 2017-11-24
    • 2017-05-14
    相关资源
    最近更新 更多