Wie wähle ich mit Python einen Dropdown-Menüwert mit Selen aus?


181

Ich muss ein Element aus einem Dropdown- Menü auswählen .

Beispielsweise:

<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) Zuerst muss ich darauf klicken. Ich mache das:

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

2) Danach muss ich das gute Element auswählen, sagen wir mal Mango.

Ich habe versucht, es damit zu tun, inputElementFruits.send_keys(...)aber es hat nicht funktioniert.

Antworten:


111

Sofern Ihr Klick keinen Ajax-Aufruf zum Auffüllen Ihrer Liste auslöst, müssen Sie den Klick nicht ausführen.

Suchen Sie einfach das Element, listen Sie die Optionen auf und wählen Sie die gewünschten Optionen aus.

Hier ist ein Beispiel:

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

Weitere Informationen finden Sie unter:
/sqa/1355/unable-to-select-an-option-using-seleniums-python-webdriver


18
Zu Ihrer Information, die Verwendung von Selectclass macht das Problem viel einfacher zu lösen, siehe die Antwort, die ich gepostet habe.
Alecxe

1
Was mache ich, wenn ich benutze find_by_id? Wie gebe ich dann den Wert an? Wie finde ich das xpatheines Elements?
Prakhar Mohan Srivastava

2
@PrakharMohanSrivastava (und andere), um den XPath zu finden. Wenn Sie die Quelle in den Chrome-Entwicklungstools hervorgehoben haben, können Sie mit der rechten Maustaste auf die Quelle klicken und Kopieren -> XPath wählen, um den vollständigen XPath dieses Elements zu erhalten.
Mollins

Und was ist, wenn ich den Namen des Textes nicht habe? Ich möchte nur das erste Element im Menü.
ScottyBlades

Die in der Antwort von @ alecxe verknüpfte Select-Klasse bietet eine select_by_index- Funktion, die anscheinend Ihren Wünschen entspricht.
Alanning

315

Selen bietet eine praktische SelectKlasse für die Arbeit mit select -> optionKonstrukten:

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

Siehe auch:


5
Dies ist ein guter Weg und sollte die De-facto-Methode sein. Ich werde jedoch darauf hinweisen, dass Sie möglicherweise die stumpfere "xpath" -Version verwenden müssen, wenn der Autor des Formulars ein ausgewähltes HTML-Element nicht ordnungsgemäß eingerichtet hat. Wenn Sie einfach Eingabefelder verwenden, sollte xpath funktionieren.
Matthew

1
Können wir das Element über xpath anstelle von by_id finden? in Auswahlfunktion?
GigaByte

2
Dies löst für mich kein Eingabeereignis aus :( Ich muss es selbst tun, wie hier erwähnt: stackoverflow.com/questions/2856513/…
Frederick Nord

1
Sehr schön. Dies räumte einige schreckliche Hacks auf, die ich benutzte.
JWW

24

Zuerst müssen Sie die Select-Klasse importieren und dann die Instanz der Select-Klasse erstellen. Nach dem Erstellen der Instanz der Select-Klasse können Sie für diese Instanz Auswahlmethoden ausführen, um die Optionen aus der Dropdown-Liste auszuwählen. Hier ist der Code

from selenium.webdriver.support.select import Select

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

12

Ich hoffe, dieser Code wird Ihnen helfen.

from selenium.webdriver.support.ui import Select

Dropdown-Element mit ID

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

Dropdown-Element mit xpath

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

Dropdown-Element mit CSS-Selektor

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

Wählen Sie 'Banane' aus einer Dropdown-Liste

  1. Verwenden des Dropdown-Index

ddelement.select_by_index(1)

  1. Verwenden des Dropdown-Werts

ddelement.select_by_value('1')

  1. Sie können den Text verwenden, der in der Dropdown-Liste angezeigt wird.

ddelement.select_by_visible_text('Banana')


Gibt es eine Möglichkeit, es in eine einzelne Codezeile zu verwandeln? anstatt eine Variable zu erstellen, um dann das Select? Danke
Jiraheta

2
Sie können einen einzelnen Zeilencode wie diesen schreiben. Wählen Sie (driver.find_element_by_id ('id_of_element')). Select_by_index (1)
NaramukAbus

7

Ich habe viele Dinge ausprobiert, aber mein Dropdown-Menü befand sich in einer Tabelle und ich konnte keine einfache Auswahloperation ausführen. Nur die folgende Lösung funktionierte. Hier hebe ich Dropdown-Elemente hervor und drücke den Abwärtspfeil, bis der gewünschte Wert erreicht ist -

        #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

Sie müssen nichts anklicken. Verwenden Sie find by xpath oder was auch immer Sie wählen und verwenden Sie dann send keys

Für Ihr Beispiel: 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")

Das ist es.


3

Sie können eine CSS-Auswahlkombination gut verwenden

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

Ändern Sie die 1 im Attribut = Wert CSS-Selektor auf den Wert, der der gewünschten Frucht entspricht.


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)

Es wird gut funktionieren


2

Es funktioniert mit Optionswert:

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

2

Auf diese Weise können Sie alle Optionen in beliebigen Dropdowns auswählen.

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)

Ich versuche, eins nach dem anderen mit auszuwählen for items in range(1,input1): inputs.select_by_index(items), aber es beginnt mit dem zweiten Index. Wie kann ich den ersten Wert erhalten?
RxT

1

Der beste Weg, mit der selenium.webdriver.support.ui.SelectKlasse mit Dropdown-Auswahl zu arbeiten, aber manchmal funktioniert es aufgrund von Entwurfsproblemen oder anderen Problemen des HTML nicht wie erwartet.

In dieser Art von Situation können Sie auch eine alternative Lösung bevorzugen, indem Sie execute_script()Folgendes verwenden: -

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

-2
  1. Listenpunkt

öffentliche Klasse 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
Die Frage fragt eindeutig nach einer Python-Lösung. Ihre Antwort wird sehr geschätzt, ist aber in diesem Zusammenhang nicht erforderlich, da sie in Java geschrieben ist.

Entschuldigung, aber dies ist nicht Python, wie in der Frage und in den Tags erwähnt
Laurent
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.