web-dev-qa-db-ja.com

フォーム内のすべての要素を取得する

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を取得するにはどうすればよいですか?そして、これらの3つの要素に値を入力してからフォームを送信しますか?

別の同様の質問:要素aを取得する場合、要素bcを取得する方法は同じ形式であり、最初に値を入力(または選択)してから、フォームを送信しますか?

前もって感謝します!

13
Eve

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 
    }  
}
_
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
ファーストネーム
苗字
Eメール
パスワード
参加する

3
GrvTyagi

申し訳ありませんが、最初に質問のポイントを逃しました。たとえば、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にします)。その後、webdriverインスタンスの代わりにこの変数を渡すことができます。

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

フォーム要素を変数に保存し、それを検索コンテキストとして使用して子要素を見つけます。

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