2012-05-22 3 views
11

У меня есть этот XPath: //*[@id="someId::button"]Селен WebDriver: найти все элементы с подобным идентификатором

Нажатие он показывает выпадающий список значений.

Теперь, я знаю, что все элементы в списке имеет идентификатор, как это:

//*[@id="someId--popup::popupItemINDEX"] 

, где INDEX это число от 1 до независимо от количества опций.

Я также знаю значение, которое я должен щелкнуть.

Один вопрос будет: так как я всегда буду знать идентификатор кнопки, которая генерирует выпадающий список, могу ли я получить все элементы в раскрывающемся меню с помощью метода многократного использования? (Мне нужно взаимодействовать с более чем одним выпадающего меню)

, как я думал о нем: получить корень исходного кода, как в:

//*[@id="someId 

затем добавить остальные: --popup::popupItem. Также нужно добавить индекс, и я думал, что я мог бы использовать TRY блок (для того, чтобы получить хотя исключения, когда я даю больше, чем ожидалось, индекс), как это:

for(int index=1;index<someBiggerThanExpectedNumber;index++){ 
    try{ 
     WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]")); 
     if(aux.getText().equals(myDesiredValue)) 
      aux.click(); 
    }catch(Exception e){} 
} 

Обратите внимание, что я с помощью WebDriver api и java.

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

EDIT: Как я предложил работ, но и для более легкого решения, принятый ответ следует рассматривать

ответ

12

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

Если я понимаю ваши потребности хорошо, хороший способ сделать это будет использовать

driver.findElement(By.id("someId::button")).click(); 
driver.findElement(By.xpath("//*[contains(@id, 'someId--popup::popupItem') " + 
    "and text()='" + myDesiredValue + "']")) 
    .click(); 

Для получения дополнительной информации о XPath см the spec. На удивление очень хорошо читаем, если вы можете пропустить дерьмо!

Это находит и нажимает на элемент с текстом, равным вашему желаемому значению, которое содержит «someId - popup :: popupItem» в его идентификаторе.

List<WebElement> list = driver.findElements(By.xpath("//*[contains(@id, 'someId--popup::popupItem')]")); 

Это находит все только все элементы, которые содержат "someId - всплывающий :: POPUPITEM" в их ID.Затем вы можете пересечь список и искать нужный элемент.

Знаете ли вы, что вы можете позвонить по номеру findElement() по телефону WebElement, чтобы найти только своих детей? - driver.findElement(By.id("someId")).findElements(By.className("clickable"))

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

+0

попытки найти все элементы не будут работать, так как список генерируется ad-hoc, кроме части id, все остальные атрибуты имеют разные значения все время, даже если значения одинаковы. Сначала мне нужно нажать кнопку выпадающего меню, чтобы иметь возможность доступа/видеть элементы. Спасибо за вклад в поиск детей элементов! – CosminO

+0

Я все еще не вижу проблемы. Нажмите кнопку раскрывающегося списка, затем найдите все отображаемые элементы? –

+1

'// * [содержит (@id, 'someId - popup :: popupItem') и text() = 'myDesiredValue']' выбирает один элемент, в котором ID содержит «someId - popup :: popupItem» и какой текст значение равно вашему желаемому значению. ... после щелчка нажатием кнопки, конечно. –

3

Вы пытались использовать JavascriptExecutor?

Если вы готовы написать небольшой JavaScript, то это будет проще, чем в Java (я думаю)

Все, что вам нужно сделать, это иметь некоторый JavaScript ползать через поддерево DOM и возвращает список Элементы DOM соответствуют вашим критериям. Затем WebDriver с радостью выделит это как List<WebElement> в мире java.

+0

В этот момент проект опирается в основном на многие другие вспомогательные классы/методы. – CosminO

1

более безопасный метод использовать здесь

int size=driver.findElements(By.xpath("//*[@id='someId::button']")).size(); 

Start using Index Now 

String builtString="//*[@id='someId::button']["; 

for(int index=1;index<=size();index++) 
{ 

try 
{ 

    WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]")); 

    if(aux.getText().equals(myDesiredValue)) 
      aux.click(); 

} 
catch(Exception e){} 

} 

Пожалуйста, дайте мне знать, выше Funda работает или нет.

+0

Это не выглядит так, как будто вы поняли вопрос. –

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