2013-11-22 25 views
7

Desidero utilizzare Selenium per inviare un modulo che contiene diversi elementi. Per esempio:Il selenio ottiene tutti gli elementi in un modulo

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

Se uso find.Element (By.name) per scoprire l'elemento del modulo, come posso ottenere elementi propri bambini a, b, ec? E inserire i valori in questi tre elementi quindi inviare il modulo?

Un'altra domanda simile è: se ottengo l'elemento a, come ottenere gli elementi b e c sono nella stessa forma e per riempire (o selezionare) i valori, poi inviare il modulo?

Grazie in anticipo!

risposta

11

È possibile utilizzare XPath per ottenere tutti gli elementi figli diretti di un elemento specifico utilizzando parent/*.

Se avete già il vostro elemento form utilizzando findElement(), come di seguito:

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

o direttamente tramite:

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

poi guardare l'etichetta e il tipo di ogni elemento per specificare il suo valore:

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

cambia linea: if (item.getTagName() == "input") a if (item.getTagName(). Equals ("input")) – njjnex

+0

@njjnex: corretto! Grazie. – Faiz

+0

Qualche idea su come ottenere elementi personalizzati con il webdriver? (http://www.html5rocks.com/en/tutorials/webcomponents/customelements/) Ho provato a utilizzare execute-script con 'return document.body.getElementsByTagName (\" * \ ")' ma questo restituisce semplicemente html standard elementi – raven

0

Siamo spiacenti, ho perso prima il punto della tua domanda. Puoi individuare qualsiasi elemento che non sia in forma con i localizzatori xpath, per esempio. Nel tuo caso

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

Se si dispone di più tag form sulla tua pagina, è possibile specificare con qualsiasi attributo pure.

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

Inoltre, è possibile specificare prima il modulo e lavorare con gli elementi al suo interno. Non sono sicuro della sintassi, ma prima, devi restituire il modulo webelement in qualche var (lascia che sia form) in qualsiasi modo. Successivamente è possibile passare questa var al posto dell'istanza di webdriver.

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

Ma se ci sono più di una forma in una pagina, otterrà tutti gli elementi. Ma voglio solo ottenere elementi in una forma specifica. – Eve

+0

Sto lavorando per l'aggiornamento, mi spiace –

+0

Grazie! Ma che ne dici se non conosco alcun attributo di elementi. C'è ancora un modo per scoprire questi elementi? – Eve

0

Conservare l'elemento del modulo in una variabile, quindi utilizzarlo come il contesto di ricerca per trovare gli elementi figlio:

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
cognome
email
la password
presentare

+2

l'ultima riga deve essere print input.get_attribute ('name') – Dss