2013-11-22 11 views
7

いくつかの要素を含むフォームを送信するには、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は同じ形式であり、最初に値を入力(または選択)してからフォームを送信しますか?

ありがとうございます!

答えて

11

あなたが使用して特定の要素のすべての直接の子要素を取得するために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()== "input")からif(item.getTagName()。equals( "input")) ) – njjnex

+0

@njjnex:固定!ありがとう。 – Faiz

+0

webdriverでカスタム要素を取得する方法はありますか? (http://www.html5rocks.com/en/tutorials/webcomponents/customelements/) 'return document.body.getElementsByTagName(\" * \ ")'でexecute-scriptを使ってみましたが、標準のhtmlを返します要素 – raven

0

ご不明な点がございましたら、まずご質問ください。 たとえば、xpathロケータを使用してフォーム内の任意の要素を見つけることができます。あなたのページに複数のフォームタグを持っている場合は、あなたにも任意の属性でそれを指定することができ、あなたの場合

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

で 。

フォームを最初に指定し、その中の要素を使用して作業することもできます。私はあなたの構文に当てはまるとは思えませんが、まずフォームwebelementを何らかのvar(それはformとする)に戻す必要があります。その後、webdriverインスタンスの代わりにこのvarを渡すことができます。

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

を提出しかし、複数のフォームがページ内に存在する場合、それはすべての要素を取得します。しかし、私はちょうど特定の形で要素を取得したい。 – Eve

+0

私はアップデートで申し訳ありません –

+0

ありがとう!しかし、私が要素の属性を知らないのはどうですか?これらの要素を見つけ出す方法はまだありますか? – Eve

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(); 
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の
last_nameの
メール
パスワード

+2

最終行はprint input.get_attribute( 'name')にする必要があります。 – Dss

関連する問題