2011-02-10 3 views
1

Я получаю разные результаты для одного и того же локатора. НапримерSelenium * ElementPresent и * XpathCount дают разные результаты?

//table[@id='foo'] 

возвращает истинное при тестировании ElementPresent, но возвращает 0 для XpathCount. В Selenium v1.0.10 IDE кнопка Find выделяет правильный элемент для обеих функций. Любые идеи о том, что может быть причиной этого?

Примечания:

  • У нас есть кадры, на странице EDIT: Это, вероятно, проблема. Баунти для проверки.
  • Есть много таблиц на странице, но только один с @Id из "Foo"
  • Firefox 3.6
  • происходит в обоих IDE и Java RC
+0

Что документ XML (пожалуйста, предоставить полный, но минимальный пример)? Я не вижу в элементе XPath никакого элемента ElementPresent'. Каковы эти «обе функции»? Вы меня здесь полностью смутили! –

+0

@Dimitre - Позвольте мне пояснить, что это для платформы тестирования Selenium (http://seleniumhq.org/), поэтому XML - это HTML-страница, а функции ElementPresent и XpathCount - это функции Selenium. – Adam

+0

Может ли это быть связано с этой ошибкой http://jira.openqa.org/browse/SEL-692 – jasso

ответ

1

Ну, это не проверка более не-проверки.

Я использую Selenium для проверки графического интерфейса с кадрами. Чтобы заставить isElementPresent и getXpathCount работать, мне всегда нужно сначала выбрать кадр с помощью selectFrame (даже чтобы заставить isElementPresent работать правильно). Просто открыв URL-адрес, кадр вообще не будет выбран.

Это то, что HTML и соответствующий код selectFrame выглядит следующим образом:

<frameset id="mainframeset"><frame name="nav" id="nav" src.... 

selenium.selectFrame("nav"); 
+0

Спасибо ygram! Тот факт, что у вас был успех с кадрами, указывает, что, возможно, я неправильно выбираю правильный фрейм. – Adam

+0

По моему опыту трудно использовать тестовые чехлы при использовании селена и фреймов. Вы можете поэкспериментировать с selectWindow (null) перед выбором кадра, waitForFrameToLoad или waitForPageToLoad. У меня также есть javascript, который делает вещи даже более беспорядочными. Но можно заставить его работать. Удачи! – ygram

0

Используйте эти выражения XPath:

boolean(//table[@id='foo']) 

и

count(//table[@id='foo']) 

В случае, если существует элемент table, значение атрибута id: "foo", то первое выражение, приведенное выше, должно быть равно true(), а второе выражение выше должно быть равно положительному целому числу.

+0

Dimitre, я не думаю, что вы понимаете контекст. Это используется * Selenium *, где имена функций: 'verifyElementPresent',' assertElementPresent', 'assertXpathCount',' storeXpathCount' и т. Д. Проблема, с которой я столкнулась, состоит в том, что '* ElementPresent' является' true', но '* XpathCount 'записывает' 0'. – Adam

+0

@Adam: Я понимаю контекст, и ясно, что у вас есть проблемы с использованием этих двух функций Selenium. Именно по этой причине я даю вам два выражения XPAth, чтобы использовать * вместо * этих функций, и это полностью устраняет вашу проблему. Я * решил * вашу проблему, устранив ее. –

+0

Возможно, я не понимаю, как использовать функции XPath внутри Selenium. 'selenium.getEval (" count (// table [@ id = 'foo'] // tr) ")' throws a 'SeleniumException' для синтаксической ошибки – Adam

0

Не совсем прямой ответ на вопрос, но обходной путь, если вы читаете это и хотите перебрать элементы. Используйте isElementPresent в цикл, как это:

for(int i = 2; selenium.isElementPresent("//table[@id='foo']//tr["+i+"]"); i++) 
{ 
    selenium.getText("//table[@id='foo']//tr["+i+"]//td["+columnNum+"]"); 
} 

Обратите внимание, что мы начинаем I на 2, так как XPath индексируется от 1, и мы хотим, чтобы пропустить заголовке