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.

Adam Bovien
quelle

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

Alanning
quelle
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:

Alecxe
quelle
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)
Vaibhav
quelle
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')

NaramukAbus
quelle
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)
Abhinav Bhatnagar
quelle
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.

Shane Cheek
quelle
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.

QHarr
quelle
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

Kuladip
quelle
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()
Jackssn
quelle
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)
Raza ul Mustafa
quelle
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);
Saurabh Gaur
quelle
-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();

}

}}

Amitabh Sinha
quelle
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