2013-08-30 3 views
1

На основе выбора вкладки будут отображаться два разных вида. Я могу получить контекст Webelements в первых параметрах, но не смог получить контекст для выбора остальных вкладок.Невозможно переключиться на iFrame с тем же именем, но в разных тегах DIV той же страницы

Проблема в том, что имя iframe уникально для двух вариантов, но они отличаются друг от друга через вкладки DIV.

Пожалуйста, найти свой HTML код и предложить обходной путь, чтобы получить контекст Webelement в DIV тег «folderProducer»,

Примечание возможность доступа к элементу «customerSearchForm: corpLastName» с переключателем по умолчанию для заявлений.

enter image description here

+0

Из html, который вы там указали, имена iframe НЕ уникальны. Следовательно, вы не можете использовать имя для переключения на второй iframe. Какими другими способами вы пытались переключиться на второй iframe? –

+0

Почему вы не могли использовать родительский div id, а затем развернуться оттуда? –

+0

@MarkRowlands - Я попробовал следующие комбинации xpath driver.switchTo(). Frame ("FWin0"); driver.switchTo(). Frame ("Content0"); driver.switchTo(). Frame (driver.findElement (By.XPath ("// ДИВ [содержит (@ идентификатор, 'folderProducer')]/следующий :: IFRAME"))); xpath = // div [содержит (@ id, 'folderProducer')]/follow :: iframe xpath = // div [содержит (@ id, 'folderProducer')]/follow :: iframe [1] – Thirumalai

ответ

3

Поскольку вы не опубликовали код Java, который вы написали, поэтому я не могу указать, что пошло не так.

Тем не менее, я не думаю, что в любом случае одинаковый вопрос. (Но это очень плохо, вы должны изменить его, хотя)

Помните, что switchTo().frame() имеет три перегрузки, вы не должны использовать индекс или имя/идентификатор, а передавать его сами. См. source code here.

Рамка WebDriver (индекс int); // нестабильный

Рамка WebDriver (String nameOrId); // не работают в вашем случае, поскольку они идентичны

Рамка WebDriver (элемент WebElement frameElement); // тот, который вы хотите

Даже driver.findElements(By.name("content")).get(N) Плохо, так как это зависит от порядка элементов, работающих, но не изящных.

Вы можете найти кадры либо родителем <div> атрибут id, либо по кадру src атрибут.

// switch out of all frames, just in case, you might not need this line here 
driver.switchTo().defaultContent(); 

// switch to customer frame 
WebElement customerFrame = driver.findElement(By.cssSelector("#folderCustomer iframe")); 
// alternative css locator: By.cssSelector("iframe[src*='customerSearch']") 
driver.switchTo().frame(customerFrame); 

// now inside customer frame, you can do stuff 

// when you done, switch out of it 
driver.switchTo().defaultContent(); 

// switch to producer frame now 
WebElement producerFrame = driver.findElement(By.cssSelector("#folderProducer iframe")); 
// alternative css locator: By.cssSelector("iframe[src*='producerSearch']") 
driver.switchTo().frame(producerFrame); 

// now inside producer frame, you can do stuff 
+0

Решение, предоставленное вами с использованием разработанного src * тега. Я пытаюсь для создания общих функций для переключения кадров в приложении. 'WebElement frameID = driver.findElement (By.cssSelector ("iframe [name = \'" + menuPaths [i] + "\ ']")); driver.switchTo() .frame (frameID); ' Чтобы перейти к этому конкретному iframe, есть два partent iframes, те теги iframes src не определены. Пожалуйста, дайте мне какие-либо предложения. – Thirumalai

+0

@Thirumalai: Эта логика выглядит хорошо. t work? То же самое имя для этих фреймов? –

+0

Да, поскольку имя фреймов одинаково, оно не работает, его попытки искать поле в первом экземпляре, то есть поиск клиента, а не поиск папки. – Thirumalai

2

Проблема заключается не в том, что элементы имеют такое же имя, а то, что они идентичны (даже их родители имеют одинаковый идентификатор).

Я бы определенно рассказал об этом разработчикам сайта (факт, что два элемента имеют одинаковый идентификатор ... который является большим нет-на сайтах).

Независимо, вы можете сделать driver.findElements(By.name("content")).get(N), чтобы получить Nth Iframe, а затем переключиться на него.

+0

Извините, этот ответ сделал несколько действительных моментов, но не имел большого смысла. Вы уверены, что не поняли вопрос (или, может быть, я это сделал)? Тот же идентификатор - это плохо, но это не влияет на то, как Селен находит элементы вообще. У 'iframes' есть разные родители, что делает их уникальными. Также они имеют разные attrutes 'src', чего также достаточно. Почему вы говорите: «Они идентичны (даже у их родителей одинаковый идентификатор)»? –

+0

Ох ... Я не видел HTML правильно. Я думал, что «folderProducer» и «folderCustomer» были одинаковыми идентификаторами. Таким образом, переключение на 'driver.findElement (By.cssSelector (" # folderCustomer iframe [name = 'content'] ");' не работает? –

0

В этом случае Xpath - это способ поиска элемента. Вы можете различать оба элемента по их Xpath.

+0

Я попробовал следующие комбинации xpath, это не сработало. driver.switchTo() кадр ("FWin0"). driver.switchTo() кадр ("Content0"). . Driver.switchTo() кадр (driver.findElement (By.xpath ("// ДИВ [содержит (@ идентификатор, 'folderP roducer')]/следующий :: IFRAME"))); xpath = // div [содержит (@ id, 'folderProducer')]/follow :: iframe xpath = // div [содержит (@ id, 'folderProducer')]/follow :: iframe [1] – Thirumalai

Смежные вопросы