Pythonを使用してSeleniumでドロップダウンメニューの値を選択するにはどうすればよいですか?


184

ドロップダウンメニューから要素を選択する必要があります。

例えば:

<select id="fruits01" class="select" name="fruits">
  <option value="0">Choose your fruits:</option>
  <option value="1">Banana</option>
  <option value="2">Mango</option>
</select>

1)最初にそれをクリックしなければなりません。私はこれをします:

inputElementFruits = driver.find_element_by_xpath("//select[id='fruits']").click()

2)その後、良い要素を選択する必要がありますMango

私はそれをやってみましたinputElementFruits.send_keys(...)が、うまくいきませんでした。

回答:


112

クリックが何らかのajax呼び出しを発生させてリストに入力しない限り、実際にクリックを実行する必要はありません。

要素を見つけてオプションを列挙し、必要なオプションを選択します。

次に例を示します。

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@name='element_name']/option[text()='option_text']").click()

詳しくは、https
//sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriverをご覧ください。


18
Select参考までに、クラスを使用すると、問題をはるかに簡単に解決できます。投稿した回答を参照してください。
alecxe 2015

1
使用している場合はどうすればよいfind_by_idですか?では、どのように値を提供するのですか また、xpath要素のをどのようにして見つけますか?
Prakhar Mohan Srivastava 2015

2
@PrakharMohanSrivastava(およびその他)を使用してXPathを検索します。Chrome開発ツールでソースが強調表示されている場合は、ソースを右クリックし、[コピー]-> [XPath]を選択して、その要素の完全なXPathを取得できます。
mgrollins 2018

テキストの名前がない場合はどうなりますか?メニューの最初の要素が欲しいだけです。
ScottyBlades

@alecxeの回答にリンクされているSelectクラスは、望みどおりのselect_by_index関数を提供します。
アラン

321

Seleniumは、コンストラクトを操作するための便利なSelectクラスを提供しますselect -> option

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Firefox()
driver.get('url')

select = Select(driver.find_element_by_id('fruits01'))

# select by visible text
select.select_by_visible_text('Banana')

# select by value 
select.select_by_value('1')

以下も参照してください。


5
これは良い方法であり、事実上の方法であるべきです。ただし、フォームの作成者が選択されたHTML要素を適切に設定していない場合は、もっとあいまいな「xpath」バージョンを使用する必要がある場合があることに注意します。単に入力フィールドを使用する場合は、xpathが機能するはずです。
マシュー

1
by_idの代わりにxpathで要素を見つけることができますか?セレクト機能では?
GigaByte

2
これは私のために入力イベントをトリガしません:(私はここで述べたように、それを自分自身をしなければならない:stackoverflow.com/questions/2856513/...
フレデリック・ノール

1
非常に素晴らしい。これは、私が使用していたいくつかのひどいハックをクリーンアップしました。
jww

25

最初にSelectクラスをインポートする必要があり、次にSelectクラスのインスタンスを作成する必要があります。Selectクラスのインスタンスを作成した後、そのインスタンスでselectメソッドを実行して、ドロップダウンリストからオプションを選択できます。これがコードです

from selenium.webdriver.support.select import Select

select_fr = Select(driver.find_element_by_id("fruits01"))
select_fr.select_by_index(0)

13

このコードがお役に立てば幸いです。

from selenium.webdriver.support.ui import Select

IDを持つドロップダウン要素

ddelement= Select(driver.find_element_by_id('id_of_element'))

xpath付きのドロップダウン要素

ddelement= Select(driver.find_element_by_xpath('xpath_of_element'))

CSSセレクター付きのドロップダウン要素

ddelement= Select(driver.find_element_by_css_selector('css_selector_of_element'))

ドロップダウンから「バナナ」を選択する

  1. ドロップダウンのインデックスを使用する

ddelement.select_by_index(1)

  1. ドロップダウンの値を使用する

ddelement.select_by_value('1')

  1. ドロップダウンに表示されるテキストと一致させることができます。

ddelement.select_by_visible_text('Banana')


それを単一のコード行にする方法はありますか?変数を作成して選択を適用するのではなく、ありがとう
Jiraheta

2
このように1行のコードを書くことができます。Select(driver.find_element_by_id( 'id_of_element'))。select_by_index(1)
NaramukAbus

7

多くのことを試しましたが、ドロップダウンがテーブル内にあり、単純な選択操作を実行できませんでした。以下のソリューションのみが機能しました。ここでは、ドロップダウン要素を強調表示し、目的の値が得られるまで下矢印を押しています-

        #identify the drop down element
        elem = browser.find_element_by_name(objectVal)
        for option in elem.find_elements_by_tag_name('option'):
            if option.text == value:
                break

            else:
                ARROW_DOWN = u'\ue015'
                elem.send_keys(ARROW_DOWN)

6

何もクリックする必要はありません。xpathまたは任意の選択による検索を使用してから、送信キーを使用します

あなたの例:HTML:

<select id="fruits01" class="select" name="fruits">
    <option value="0">Choose your fruits:</option>
    <option value="1">Banana</option>
    <option value="2">Mango</option>
</select>

Python:

fruit_field = browser.find_element_by_xpath("//input[@name='fruits']")
fruit_field.send_keys("Mango")

それでおしまい。


3

あなたはCSSセレクタの組み合わせをうまく使うことができます

driver.find_element_by_css_selector("#fruits01 [value='1']").click()

attribute = value cssセレクターの1を、目的の果物に対応する値に変更します。


2
from selenium.webdriver.support.ui import Select
driver = webdriver.Ie(".\\IEDriverServer.exe")
driver.get("https://test.com")
select = Select(driver.find_element_by_xpath("""//input[@name='n_name']"""))
select.select_by_index(2)

それはうまくいきます


2

オプション値で動作します:

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@class='class_name']/option[@value='option_value']").click()

2

このようにして、ドロップダウンのすべてのオプションを選択できます。

driver.get("https://www.spectrapremium.com/en/aftermarket/north-america")

print( "The title is  : " + driver.title)

inputs = Select(driver.find_element_by_css_selector('#year'))

input1 = len(inputs.options)

for items in range(input1):

    inputs.select_by_index(items)
    time.sleep(1)

を使用して1つずつ選択しようとしていますfor items in range(1,input1): inputs.select_by_index(items)が、2番目のインデックスから始まります。最初の値を取得するにはどうすればよいですか?
RxT

1

selenium.webdriver.support.ui.Selectクラスを使用してドロップダウン選択を処理する最善の方法ですが、HTMLの設計上の問題またはその他の問題のため、期待どおりに機能しないことがあります。

このタイプの状況ではexecute_script()、以下を使用して代替ソリューションとして優先することもできます:-

option_visible_text = "Banana"
select = driver.find_element_by_id("fruits01")

#now use this to select option from dropdown by visible text 
driver.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", select, option_visible_text);

0

提供されるHTMLのとおり:

<select id="fruits01" class="select" name="fruits">
  <option value="0">Choose your fruits:</option>
  <option value="1">Banana</option>
  <option value="2">Mango</option>
</select>

<option>から要素を選択するには[ クラス選択 ]を使用する必要があるメニュー。さらに、あなたはと対話する必要があるのでWebDriverWaitを誘導する必要がありelement_to_be_clickable()ます。

から<option>テキスト付きのマンゴーを選択するには次のロケーター戦略のいずれかを使用できます。

  • ID属性とselect_by_visible_text()メソッドの使用:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import Select
    
    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "fruits01"))))
    select.select_by_visible_text("Mango")
  • 使用してCSSセレクタselect_by_value()方法を:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
  • XPATHselect_by_index()メソッドの使用:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "//select[@class='select' and @name='fruits']"))))
    select.select_by_index(2)

-2
  1. リストアイテム

パブリッククラスListBoxMultiple {

public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
    WebDriver driver=new ChromeDriver();
    driver.get("file:///C:/Users/Amitabh/Desktop/hotel2.html");//open the website
    driver.manage().window().maximize();


    WebElement hotel = driver.findElement(By.id("maarya"));//get the element

    Select sel=new Select(hotel);//for handling list box
    //isMultiple
    if(sel.isMultiple()){
        System.out.println("it is multi select list");
    }
    else{
        System.out.println("it is single select list");
    }
    //select option
    sel.selectByIndex(1);// you can select by index values
    sel.selectByValue("p");//you can select by value
    sel.selectByVisibleText("Fish");// you can also select by visible text of the options
    //deselect option but this is possible only in case of multiple lists
    Thread.sleep(1000);
    sel.deselectByIndex(1);
    sel.deselectAll();

    //getOptions
    List<WebElement> options = sel.getOptions();

    int count=options.size();
    System.out.println("Total options: "+count);

    for(WebElement opt:options){ // getting text of every elements
        String text=opt.getText();
        System.out.println(text);
        }

    //select all options
    for(int i=0;i<count;i++){
        sel.selectByIndex(i);
        Thread.sleep(1000);
    }

    driver.quit();

}

}


2
質問は明らかにPythonソリューションを要求します。あなたの答えは高く評価されますが、Javaで記述されているため、このコンテキストでは必要ありません。

申し訳ありませんが、質問とタグに記載されているPythonではありません
Laurent
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.