web-dev-qa-db-fra.com

Obtenez tous les éléments dans un formulaire

Je souhaite utiliser Selenium pour soumettre un formulaire contenant plusieurs éléments. Par exemple:

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

Si j'utilise find.Element (By.name) pour trouver l'élément de formulaire, comment puis-je obtenir ses éléments enfants a, b et c? Et entrez les valeurs dans ces trois éléments puis soumettez le formulaire?

Une autre question similaire est la suivante: si j'obtiens l'élément a, comment obtenir les éléments b et c sont sous la même forme et remplir d'abord (ou sélectionner) des valeurs, puis soumettre le formulaire?

Merci d'avance!

13
Eve

Vous pouvez utiliser xpath pour obtenir tous les éléments enfants directs d'un élément spécifique en utilisant parent/*.

Si vous avez déjà votre élément form en utilisant findElement(), comme ci-dessous:

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

ou en utilisant directement:

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

Regardez ensuite la balise et le type de chaque élément pour spécifier sa valeur:

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 
    }  
}
17
Faiz
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
Prénom
nom de famille
email
mot de passe
soumettre

3
GrvTyagi

Désolé, vous avez manqué le point de votre question en premier. Vous pouvez localiser n'importe quel élément dans le formulaire avec des localisateurs xpath, par exemple. Dans ton cas

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

Si vous avez plusieurs balises de formulaire sur votre page, vous pouvez également la spécifier avec n'importe quel attribut.

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

Vous pouvez également spécifier le formulaire en premier et travailler avec les éléments qu'il contient. Je ne suis pas sûr de votre syntaxe, mais d'abord, vous devez retourner le formulaire webelement dans un var (que ce soit form) de quelque façon que ce soit. Après cela, vous pouvez passer cette var au lieu de l'instance de webdriver.

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

Stockez l'élément de formulaire dans une variable, puis utilisez-le comme contexte de recherche pour trouver les éléments enfants:

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();
0
Marielle