2013-11-22 1 views
7

Я хотел бы использовать Selenium для отправки формы, которая содержит несколько элементов. Например:Selenium получить все элементы в форме

<form name="something"> 
    <input type="text" name="a">Username</input> 
    <input type="password" name="b">password</input> 
    <select name="c" id="c"> 
     <option value="1">1</option> 
     <option value="2">2</option> 
    </select> 
    <input type="submit" name="submit">submit</input> 
</form> 

Если я использую find.Element (By.name), чтобы выяснить элемент формы, как я могу получить его дочерние элементы а, Ь, с? И введите значения в эти три элемента, затем отправьте форму?

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

Заранее благодарен!

ответ

11

Вы можете использовать XPath, чтобы получить все прямые элементы ребенка определенного элемента, используя parent/*.

Если у вас уже есть свой form элемент, используя findElement(), как показано ниже:

WebElement formElement = driver.findElement(By.name("something")); 
List<WebElement> allFormChildElements = formElement.findElements(By.xpath("*")); 

или непосредственно с помощью:

List<WebElement> allFormChildElements = driver.findElements(By.xpath("//form[@name='something']/*")); 

Затем посмотреть на тег и тип каждого элемента, чтобы указать его значение:

for (WebElement item : allFormChildElements) 
{ 
    if (item.getTagName().equals("input")) 
    { 
     switch (item.getAttribute("type")) 
     { 
      case "text": 
       //specify text value 
       break; 
      case "checkbox": 
       //check or uncheck 
       break; 
      //and so on 
     } 
    } 
    else if (item.getTagName().equals("select")) 
    { 
     //select an item from the select list 
    } 
} 
+1

изменить строку: if (item.getTagName() == "input") в if (item.getTagName(). Equals ("input")) – njjnex

+0

@njjnex: исправлено! Благодарю. – Faiz

+0

Любая идея, как получить пользовательские элементы с webdriver? (http://www.html5rocks.com/en/tutorials/webcomponents/customelements/) Я попытался использовать сценарий выполнения с 'return document.body.getElementsByTagName (\" * \ ")', но это просто возвращает стандартный html элементы – raven

0

Извините, упущен вопрос о первом вопросе. Вы можете найти любой элемент witihin в форме с помощью локаторов xpath, например. В вашем случае

find.Element(By.xpath("//form/*[@name='a']")) 
find.Element(By.xpath("//form/*[@name='b']")) 
find.Element(By.xpath("//form/*[@name='c']")) 

Если у вас есть несколько тегов формы на вашей странице, вы можете указать его с любым атрибутом, а также.

find.Element(By.xpath("//form[@name='something']/*[@name='c']")) //as it is in your sample 

Также вы можете указать форму сначала и работать с элементами внутри нее. Я не уверен в вашем синтаксисе, но сначала вам нужно вернуть форму webelement в некоторый var (пусть это будет form). После этого вы можете передать этот var вместо экземпляра webdriver.

form.find.Element(By.xpath('./some/child/locator')) 
+0

Но если есть более чем одна форма на странице, он будет получать все элементы. Но я просто хочу получить элементы в определенной форме. – Eve

+0

Я работаю над обновлением, извините –

+0

Спасибо! Но как насчет того, если я не знаю атрибута элементов. Есть ли способ узнать эти элементы? – Eve

0

Храните элемент формы в переменной, а затем использовать его в качестве контекста поиска, чтобы найти дочерние элементы:

WebElement formElement = driver.findElement(By.name("something")); 
WebElement a = formElement.findElement(By.name("a")); 
WebElement b = formElement.findElement(By.name("b")); 
WebElement c = formElement.findElement(By.name("c")); 

a.sendKeys("first child element [a]"); 
b.sendKeys("password"); 
c.submit(); 
3
driver = webdriver.Firefox() 
driver.get("https://www.hackerearth.com/problems/") 

#find all form input fields via form name 
_inputs = driver.find_elements_by_xpath('//form[@name="signup-form"]//input') 

for input in _inputs:                
    #print attribute name of each input element 
    print input.get_attribute('name') 

о/р
first_name
last_name
электронной
пароль
отправить

+2

Последняя строка должна быть напечатана input.get_attribute ('name') – Dss