Селен и iframe
У меня есть iframe, который загружается, когда я нажимаю вкладку на странице. Когда я использую Firebug для просмотра iframe в IE8, все, что я вижу, это:
iframe id=tabContextFrame class=contextFrame contentEditable=inherit src=/xyz.dt?forward=show&layouttype=NoHeader&runid=1234 name=tabContextFrame url=/xyz.dt?forward=show&layouttype=NoHeader&runid=1234 scrolling=auto
и что it.На иерархии ниже iframe не видно. Я хочу щелкнуть ссылку в iframe. Чтобы найти элементы в iframe, я сделал selenium.click("on the tab that loads the iframe")
, а затем selenium.getHtmlSource()
. Из этого источника я могу хотя бы найти интересующую меня ссылку. Я сделал selenium.click("//span[text()='Link']")
, но он ничего не делает. Любые идеи, пожалуйста?
Вот код:
selenium.click("//span[text()='tab that loads iframe']");
Thread.sleep(5000);
selenium.selectFrame("tabContextFrame");
selenium.mouseOver("//span[text()='Link']");
selenium.mouseDown("//span[text()='Link']");
selenium.mouseUp("//span[text()='Link']");
Thread.sleep(5000);
selenium.selectFrame("null");
Ответы
Ответ 1
Я предполагаю, что вы используете Selenium 1.0. Вы посмотрели на Selenium 2.0 и WebDriver. Я нашел следующее, и это сработало для меня:
Q: Как я могу ввести в contentEditable iframe? A: Предполагая, что iframe называется "foo":
driver.switchTo().frame("foo");
WebElement editable = driver.switchTo().activeElement();
editable.sendKeys("Your text here");
Иногда это не работает, и это потому, что iframe не имеет никакого контента. В Firefox вы можете выполнить следующее перед "sendKeys":
((JavascriptExecutor) driver).executeScript("document.body.innerHTML = '<br>'");
Это необходимо, потому что iframe не имеет содержимого по умолчанию: там ничего не посылать ввод с клавиатуры. Этот вызов метода вставляет пустой тег, который прекрасно устанавливает все.
Не забудьте выключить рамку, как только вы закончите (как все дальше взаимодействия будут с этим конкретным фреймом):
driver.switchTo().defaultContent();
Я нашел это на http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions
Ответ 2
Использовать driver.switchTo(). defaultContent(); сначала выполните свою операцию