2013-11-22 30 views
7

Chciałbym użyć Selenium, aby przesłać formularz, który zawiera kilka elementów. Na przykład:Selen uzyskać wszystkie elementy w postaci

<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> 

Jeśli używam find.Element (By.name), aby dowiedzieć się element formularza, w jaki sposób mogę uzyskać jego dzieci elementów a, b oraz c? I wprowadź wartości do tych trzech elementów, a następnie prześlij formularz?

Innym podobne pytanie brzmi: czy mogę dostać element a, jak zdobyć elementy b i c są w tej samej formie i wypełnić (lub wybierz) wartości, a następnie przesłać formularz?

Z góry dziękuję!

Odpowiedz

11

Można użyć XPath, aby uzyskać wszystkie bezpośrednie elementy podrzędne określonego elementu za pomocą parent/*.

Jeśli masz już swoje elementu form korzystając findElement(), jak poniżej:

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

lub bezpośrednio przy użyciu:

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

następnie spojrzeć na znaczniku i rodzaj każdego elementu, aby określić jego wartość:

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

zmienić linię: if (item.getTagName() == "input") na if (item.getTagName(). Equals ("input")) – njjnex

+0

@njjnex: naprawiono! dzięki. – Faiz

+0

Każdy pomysł, jak zdobyć niestandardowe elementy za pomocą webdrivera? (http://www.html5rocks.com/en/tutorials/webcomponents/customelements/) Próbowałem używać skryptu execute z 'return document.body.getElementsByTagName (\" * \ ")', ale to po prostu zwraca standardowy html elementy – raven

0

Najpierw przepadł punkt Twojego pytania. Możesz znaleźć dowolny element z formularzem z lokalizatorami xpath, na przykład. W twoim przypadku

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

Jeśli masz wiele tagów formularza na stronie, można określić go z dowolnego atrybutu, jak również.

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

Możesz również określić formularz jako pierwszy i pracować z elementami w nim. Nie jestem pewien co do twojej składni, ale najpierw musisz zwrócić formularz webowy do jakiegoś var (niech to będzie form) w jakikolwiek sposób. Następnie możesz przekazać ten var zamiast instancji webdriver.

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

Ale jeśli istnieje więcej niż jeden formularz na stronie, będzie się wszystkie elementy. Ale chcę tylko uzyskać elementy w określonej formie. – Eve

+0

Pracuję nad aktualizacją, przepraszam –

+0

Dzięki! Ale co powiesz, jeśli nie znam żadnego atrybutu elementów? Czy istnieje jeszcze sposób, aby dowiedzieć się o tych elementach? – Eve

0

Store element forma w zmiennej, a następnie użyć go jako kontekst wyszukiwania, aby znaleźć elementy podrzędne:

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') 

o/p
first_name
LAST_NAME
email
hasło
złożyć

+2

ostatni wiersz powinien być wydrukowany input.get_attribute ('name') – Dss