2012-03-15 2 views
1

Использование Selenium WebDriver в классе java, где я пытаюсь найти этот конкретный элемент, а затем автоматически добавлять необходимое количество этого элемента в поле ввода.Поиск элементов HTML для использования в Selenium WebDriver

У меня есть таблица HTML с каждой строкой, указывающая тип элемента и поле ввода, используемое для добавления X в количество элемента в определенной строке.

<tr> 
    <td class="non-sortable-table"> 
    <input class="required text" type="text" value="0" name="plate_order{pageFlow.plateorders[0].numberOfPlates}" tabindex="25"> 
    </td> 
    <td class="non-sortable-table"> 
    <span>20% - White plates</span> 
    </td> 
    ... 
</tr> 

Я попытался следующие в моем коде Java для того, чтобы получить этот элемент, но не повезло:

WebElement element = (WebElement) js.executeScript("return ${\"document.getElementsByName('plate_order{pageFlow.plateorders[0].numberOfPlates}')\""); 

WebElement element = driver.findElement(By.ByName('plate_order{pageFlow.plateorders[0].numberOfPlates}')) 

, как я мог бы извлечь этот элемент для редактирования его ввода? Возможно ли, когда части имени элемента являются ссылкой на контроллер, то есть на страницу Flow?

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

Я пытался получить, что один с помощью XPath и CSSSelector не повезло. Любые предложения?

+1

«// tr/td [@ class = 'non-sortable-table'] [2]/span" – faramka

ответ

2

Мне кажется, что вы можете использовать оператор типа start-with в XPath или CSS.

Что-то вроде:

XPath: //input[starts-with(@name, 'plate_order')] 
CSS: input[name^='plate_order'] 

Подобные вещи должны работать на пролете, тоже (если вы знаете, текст):

XPath: //span[starts-with(., '20%')] 
CSS/Sizzle*: span:contains('20%') 

Если вы не знаете текст, то что-то это xpath может работать.

XPath: //input[starts-with(@name, 'plate_order]/../../td/span 

* содержит функцию не является чистым CSS. Это дополнение, предоставляемое библиотекой Sizzle. Это может работать или не работать, в зависимости от того, использует ли Selenium встроенную библиотеку CSS или вводит Sizzle.

+0

Элегантный, начинается с того, что мне здесь нужно. Тем не менее, я решил использовать 'String [] elements = driver.findElement (By.xpath (" // table/tbody ")). GetText(). Split (" \\ n ");' поскольку его a getText просто возвращает строку каждого элемента таблицы tbody. Затем я использовал каждую строку для определения того, какие ордера были размещены. –

+0

Ответ Энди Тинкхэма хорошо описывает xpath. спасибо Энди. Я узнал, как писать xpath, когда нет идентификатора или имени тега. // span [start-with (., '20% ')]: это полезно для меня –

4

Чтобы вернуть элемент из результата JavaScript, вы можете использовать следующий синтаксис (я использовал JQuery как упрощение):

RenderedWebElement webElement = (RenderedWebElement) ((JavascriptExecutor) webDriver).executeScript("return jQuery('input[name^=plate_order]').get(0);"); 

Вы также можете передать элемент, который был previosly выбранный в Селен:

((JavascriptExecutor) webDriver).executeScript("return doSomethingWithElement(arguments[0]);", webElement); 
Смежные вопросы