Не удается настроить таргетинг на iframe с помощью watir-webdriver - Ошибка? - PullRequest
1 голос
/ 16 марта 2012

Я довольно новичок в области автоматизации и watir-webdriver, так что простите меня, если я не выгляжу супер технично.

Я пытаюсь войти на веб-сайт, и форма входа находится внутри iframe.На той же странице есть еще один iframe, содержащий изображение.

Это html:

<body>
<div class="topbar">
<div class="topbarcenter">
<ul>
<li id="logo" class="logo">
<div id="provider_logo">
<iframe id="logo_iframe" width="192px" height="128px" frameborder="0" src="http://social.onerecovery.com/modules/iframes/html/provider_logo.html?prov=microsites" onload="this.style.visibility = "visible";" style="visibility: visible;" allowtransparency="true">
</div>
</li>
<li class="login">
<iframe id="login_iframe" width="550px" height="70px" frameborder="0" src="http://social.onerecovery.com/modules/iframes/html/login.html" onload="this.style.visibility = "visible";" style="visibility: visible;" allowtransparency="true">
<html>
<head>
<body>
<div class="login_container">
<div id="login_div">
<form class="login_form" action="#" method="post">
<input type="text" maxlength="100" placeholder="Email Address..." class="email_input processed" name="email">

, если я использую watir-webdriver 0.3.5 и автоматизирую работу на Chrome17

я пытался: $b.frame(:id => "login_iframe").form(:class => "login_form").text_field(:name => "email").set("username")

, который, как я думал, будет работать, но в командной строке я просто получаю сообщение об ошибке: Watir::Exception::UnknownObjectException: unable to locate element, using {:class=>"login_form", :tag_name=>"form"}

Я также пытался индексироватьiframe, чтобы убедиться, что я был во втором iframe, а не в первом, но он все еще не работал.

Когда я делаю $b.frame(:id => "login_iframe").exists? в командной строке, я получаю true

но когда я делаю $b.frame(:id => "login_iframe").form(:class => "login_form").exists? в командной строке, я получаю false

Дело в том, что у нас есть другая страница, которую кто-то может использовать для входа на тот же сайт, и единственное отличие между этой страницей и этой страницейв том, что на этой странице есть второй iframe, тогда как на другой странице есть только логин iframe и код $b.frame(:id => "login_iframe").form(:class => "login_form").text_field(:name => "email").set("username") работает отлично.Извините, что так долго.Просто хотел убедиться, что я дал достаточно информации.Заранее спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2015

Для последних версий это browser.iframes, в котором перечислены все текущие окна iframe.

browser.iframes.map {|iframe| iframe.src}

Это отобразит src атрибуты всех iframes.

0 голосов
/ 16 марта 2012

Краткий ответ для решения вашей проблемы - использовать browser.frame(:index => 2) вместо browser.frame(:id => "login_iframe").

Или, если вам нужно более надежное решение:

frame = browser.frames.find{ |frame| frame.form(:class => "login_form").exists? }
frame.form(:class => "login_form").text_field(:name => "email").set("username")

Тем не менее, я действительно не знаю, почему это работает. Это похоже на то, что он думает, что элемент управления входом находится внутри invite_iframe, на который он не похож в HTML. Я попытаюсь копать глубже, но для меня это звучит как ошибка.

Похоже, что все кадры смешаны. Как видно из следующего, количество текстовых полей в каждом iframe не соответствует ожидаемому.

browser.frames.each{ |x| puts x.id + ' - ' + x.text_fields.length.to_s + ' text_fields' }
#=> logo_iframe - 3 text_fields
#=> login_iframe - 0 text_fields
#=> invite_iframe - 2 text_fields
...