C#Selenium Webdriver在Iframe中查找元素

时间:2014-11-19 18:14:34

标签: c# iframe selenium-webdriver

我无法找到iframe。我想切换到这个iframe,然后点击其中的元素。

我尝试使用Id,Xpath,TagName和CssSelector查找iframe,但我的测试在每次查找元素时超时。

这是页面来源中显示的iframe:

<div xmlns="http://www.w3.org/1999/xhtml" id="dashboardView" style="display: block;">
        <iframe id="dashboardViewFrame" border="0" scrolling="no" frameborder="0"
style="visibility: visible; height: 607px; width: 1280px; background-color: transparent;"
src="HtmlViewer.ashx?Dd_ContentId=6a8a44ae-2bd5-4f3c-8583-e777279ad4f2"></iframe>
    </div>

<iframe xmlns="http://www.w3.org/1999/xhtml" id="dashboardViewFrame" border="0" scrolling="no"
frameborder="0" style="visibility: visible; height: 607px; width: 1280px; background-color:
transparent;" src="HtmlViewer.ashx?Dd_ContentId=6a8a44ae-2bd5-4f3c-8583-e777279ad4f2"></iframe>

这是我目前的代码:

    public static bool IsAt
    {
        get
        {
            try
            {
                var dashboardiFrame = Driver.Instance.FindElement(By.Id("dashboardViewFrame"));
                //todo switch to iframe
                //todo find element within iframe
                return true;
            }
            catch
            {
                return false;
            }
        }
    }

有人可以建议一种方法来找到iframe并切换到它吗?

2 个答案:

答案 0 :(得分:2)

主要问题是我的测试打开了一个新窗口,但我的测试是在旧窗口上查找元素。我通过使用以下方法切换到新页面来解决这个问题:

Driver.Instance.SwitchTo().Window(Driver.Instance.WindowHandles.Last());

然后我也可以通过使用SwitchTo()切换到iframe,如下所示:

public static bool IsAt
    {
        get
        {
            try
            {
                Driver.Instance.SwitchTo().Window(Driver.Instance.WindowHandles.Last());
                var DBViFrame = Driver.Instance.FindElement(By.Id("dashboardViewFrame"));
                Driver.Instance.SwitchTo().Frame(DBViFrame);
                var dataEntryButton = Driver.Instance.FindElement(By.Id("HyperlinkDataEntry"));
                dataEntryButton.Click();
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }
    }

答案 1 :(得分:2)

有些时候你必须在5秒左右睡觉,直到页面加载完全然后找到框架。

试试这个

Thread.sleep代码(50000); IwebElement Frame = Driver.SwitchTo()。Frame(&#34;帧的id&#34;);

//然后帧内的任何元素都应该通过这一行

Frame.FindElement(By.id(&#34;框架内的元素ID&#34;);