获取表单中的所有元素

16

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

另一个类似的问题是:如果我获得了元素,如何获取在同一表单中的元素和,然后填充(或选择)值,然后提交表单?

提前感谢!

4个回答

21
你可以使用xpath获取特定元素的所有直接子元素,方法是使用parent/*
如果你已经使用findElement()选择了你的form元素,如下所示:
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
将代码行修改为:if(item.getTagName().equals("input")),而不是 if(item.getTagName() =="input")。 - njjnex
有没有想法如何使用WebDriver获取自定义元素?(http://www.html5rocks.com/en/tutorials/webcomponents/customelements/)我尝试使用execute-script和`return document.body.getElementsByTagName("*")`,但这只返回标准的HTML元素。 - raven

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

输出
名字
姓氏
邮箱
密码
提交

(注:该段文字为IT技术相关内容,涉及表单输入框的名称翻译)

2
最后一行应该是 print input.get_attribute('name')。 - Dss

1
抱歉,我先前误解了你的问题。你可以使用 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 返回到某个变量(让其为form)。之后,您可以传递此变量而不是webdriver实例。

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

但是如果页面中有多个表单,它会获取所有元素。但我只想获取特定表单中的元素。 - Eve
谢谢!但是如果我不知道元素的任何属性,还有办法找到这些元素吗? - Eve
有点奇怪的请求。如果元素属性是动态的,你应该知道它们的元素属性或至少它们的常量部分。 - Furious Duck

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接