获取表单中的所有元素

时间:2013-11-22 15:37:26

标签: html forms selenium-webdriver nested elements

我想使用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?然后将值输入这三个元素,然后提交表单?

另一个类似的问题是:如果我得到元素a,那么如何获取元素bc的形式相同并首先填充(或选择)值,然后提交表格?

提前致谢!

4 个答案:

答案 0 :(得分:16)

您可以使用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 :(得分: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
  姓氏
  电子邮件
  密码
  提交

答案 2 :(得分:0)

抱歉,先错过了你的问题。 例如,您可以使用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'))

答案 3 :(得分: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();