Selenium 2 - переключение фокуса на кадр, у которого нет имени/идентификатора

Итак, сейчас я пытаюсь понять, как я могу переключить фокус на кадр в Selenium 2, когда у кадра нет имени или идентификатора? Для именованного фрейма я делаю:

driver.SwitchTo().Frame(FrameName);

а что нет имени? Кто-нибудь имел опыт с этим?


person James    schedule 23.08.2010    source источник
comment
Вы можете просто указать идентификатор вашего iframe вместо имени iframe. Пожалуйста, посмотрите мой пример ниже, это сработало для меня. ‹iframe id=topframe height=83px frameborder=0 width=100% scrolling=NO '1331808552380'= += src=initialize.do?init=header&cacheBuster= name=topframe marginheight=0 marginwidth=0›   -  person Rakesh Prabhakaran    schedule 15.03.2012


Ответы (5)


driver.switchTo.frame() — это перегружен, чтобы принимать имя фрейма или целое число. Этот int представляет собой индекс доступных кадров, основанный на 0. Первый кадр будет 0, второй 1 и так далее.

Я только что провел очень быстрый тест, используя привязку java и Firefox к этой HTML-странице.

<html>
<frameset rows="50%,50%">
    <frame src="frame_a.htm" />
    <frame src="frame_b.htm" />
</frameset>
</html>

Я успешно могу использовать driver.switchTo().frame(0); для ссылки на кадр a и driver.switchTo().frame(1); для доступа к кадру b.

person pnewhook    schedule 10.09.2010

Вы можете использовать индекс кадра. Поскольку у вас нет имени и идентификатора кадра, driver.switchTo().frame(int frameIndex)

person nilesh    schedule 10.11.2010

В селене, если вы знаете относительное расположение кадра, вы должны иметь возможность использовать команду selectFrame со строкой «относительное = вверх», чтобы переместить его вверх на кадр, например. selenium.SelectFrame("relative=up"); или для перехода к верхнему кадру используйте "relative=top"

person Nathan    schedule 24.08.2010
comment
Вы знаете, существует ли это в Selenium 2? - person James; 24.08.2010

Вы можете просто указать идентификатор вашего iframe вместо имени iframe.

Пожалуйста, посмотрите мой пример ниже, он сработал для меня.
В этом примере я переключаюсь на один iframe на своей странице и нажимаю на элемент в этом iframe, который называется "worksheet0" .

Используйте код:

driver.switchTo().frame("topframe");    
    WebElement worksheet0 = driver.findElement(By.xpath("//*@id='reportSelect:Worksheet_lbl']"));               worksheet0.click();             

HTML-код iframe:

  < iframe id="topframe" height="83px" frameborder="0" width="100%" scrolling="NO" '1331808552380'"="" +="" src="initialize.do?init=header&cacheBuster=" name="topframe" marginheight="0" marginwidth="0">
person Rakesh Prabhakaran    schedule 15.03.2012

Помимо использования индекса (как предполагают другие ответы), в C# вы можете выбрать iFrame по имени тега. В моем примере предполагается, что на странице есть один и только один iFrame.

try
{
    var iFrameElement = Driver.FindElementByTagName("iFrame");
    var driver = Driver.SwitchTo().Frame(this.iFrameElement);    
    var element = driver.FindElement(selector);

    // do what you need with the element
}
finally
{
    // don't forget to switch back to the DefaultContent
    Driver.SwitchTo().DefaultContent();
}

Примечание. Вы должны получить информацию из IWebElement .Text или .Click, например, перед вызовом Driver.SwitchTo().DefaultContent();

Я создал эти методы расширения, чтобы помочь

public static IWebDriver SwitchToIFrame(this RemoteWebDriver driver)
{
    // http://computerrecipes.wordpress.com/2012/08/23/selenium-webdriver-interact-with-an-element-inside-an-iframe/
    // http://stackoverflow.com/questions/3549584/selenium-2-switching-focus-to-a-frame-that-has-no-name-id
    var iFrameElement = driver.FindElementByTagName("iFrame");
    return driver.SwitchTo().Frame(iFrameElement);
}

public static void SwitchOutOfIFrame(this IWebDriver driver)
{
    driver.SwitchTo().DefaultContent();
}

Пример использования методов расширения:

public void ClickPrintButton()
{
    var iFrameDriver = Browser.Driver.SwitchToIFrame();
    try
    {
        iFrameDriver.FindElement(By.Id("saveButton")).Click();
    }
    finally
    {
        Browser.Driver.SwitchOutOfIFrame();
    }
}
person AlignedDev    schedule 02.04.2014