Get all Elements in a Form

后端 未结 4 1315
渐次进展
渐次进展 2021-02-02 14:56

I would like to use Selenium to submit a form which contains several elements. For example:

相关标签:
4条回答
  • 2021-02-02 15:20

    Store the form element in a variable, then use it as the search context to find the child elements:

    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 讨论(0)
  • 2021-02-02 15:22

    You can use xpath to get all direct child elements of a specific element using parent/*.

    If you already have your form element using findElement(), as below:

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

    or directly using:

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

    Then look at the tag and type of each element to specify its value:

    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 
        }  
    }
    
    0 讨论(0)
  • 2021-02-02 15:25

    Sorry, missed the point of your question first. You can locate any element witihin the form with xpath locators, for example. In your case

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

    If you have multiple form tags on your page, you can specify it with any attribute as well.

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

    Also you can specify form first, and work with elements within it. I'm not sure abut your syntax, but first, you need to return the form webelement into some var (let it be form) in any way. After that you may pass this var instead of webdriver instance.

    form.find.Element(By.xpath('./some/child/locator'))
    
    0 讨论(0)
  • 2021-02-02 15:34
    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
    password
    submit

    0 讨论(0)
提交回复
热议问题