【问题标题】:Get all Elements in a Form获取表单中的所有元素
【发布时间】:2013-11-22 15:37:25
【问题描述】:

我想使用 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在同一个表单中并先填写(或选择)值,然后提交表单?

提前致谢!

【问题讨论】:

    标签: html forms selenium-webdriver nested elements


    【解决方案1】:

    您可以使用 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 
        }  
    }
    

    【讨论】:

    • 换行:if(item.getTagName() =="input") 到 if(item.getTagName().equals("input"))
    • 知道如何使用 webdriver 获取自定义元素吗? (html5rocks.com/en/tutorials/webcomponents/customelements) 我尝试过使用带有 return document.body.getElementsByTagName(\"*\") 的执行脚本,但这只会返回标准的 html 元素
    【解决方案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')
    

    o/p
    名字
    姓氏
    电子邮件
    密码
    提交

    【讨论】:

    • 最后一行应该是 print input.get_attribute('name')
    【解决方案3】:

    对不起,首先错过了您的问题的重点。 例如,您可以使用 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'))
    

    【讨论】:

    • 但是如果一个页面中有多个表单,它将获取所有元素。但我只想获取特定形式的元素。
    • 谢谢!但是,如果我不知道元素的任何属性怎么办。还有办法找出这些元素吗?
    • 有点奇怪的要求。如果它们是动态的,您应该知道元素属性或至少它们的常量部分
    【解决方案4】:

    将表单元素存储在变量中,然后将其用作搜索上下文以查找子元素:

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

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 2012-09-09
      • 2012-01-01
      • 2019-09-20
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多