Selenium 2-переключение фокуса на кадр без имени / идентификатора
Итак, прямо сейчас я пытаюсь выяснить, как я могу переключить фокус на кадр в Selenium 2, когда у кадра нет имени или идентификатора? Для именованного фрейма я делаю:
driver.SwitchTo().Frame(FrameName);
но что такое нет имени? У кого-нибудь был опыт в этом?
5 ответов
драйвер.switchTo.frame () is перегружен, чтобы принять имя Рамы или целое число. Этот int является индексом на основе 0 доступных кадров. Первый кадр будет 0, второй 1 и так далее.
Я только что провел очень быстрый тест, используя привязку java и Firefox против этой HTML-страницы.
<html>
<frameset rows="50%,50%">
<frame src="frame_a.htm" />
<frame src="frame_b.htm" />
</frameset>
</html>
Я успешно могу использовать драйвер.switchTo().рамка (0); для обозначения рамки a и водитель.switchTo().Кадр (1); для доступа к кадру b.
вы можете использовать индекс кадра. Поскольку у вас нет имени и ID для рамки, водитель.switchTo().frame (int frameIndex)
в selenium, если вы знаете, что относительное расположение кадра вы должны иметь возможность использовать команду selectFrame со строкой "relative=up", чтобы переместить его вверх по кадру, например selenium.SelectFrame("relative=up");
или для перехода к верхней рамке используйте "relative=top"
вы можете просто дать идентификатор вашего iframe вместо iframe-name.
пожалуйста, посмотрите мой пример ниже, это сработало для меня.
В примере я переключаюсь на один iframe на своей странице и нажимаю на элемент в этом iframe, который является "worksheet0" .
использовать код :
driver.switchTo().frame("topframe");
WebElement worksheet0 = driver.findElement(By.xpath("//*@id='reportSelect:Worksheet_lbl']")); worksheet0.click();
HTMLof 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">
В дополнение к использованию индекса (как предлагают другие ответы), в C# вы можете выбрать iFrame по tagName. В моем примере предполагается, что на странице есть один и только один 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 .Текст или. Нажмите, например, перед вызовом драйвера.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();
}
}