Python kullanarak Selenium ile açılır menü değeri nasıl seçilir?


185

Açılır listeden bir öğe seçmem gerekiyor .

Örneğin:

<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) Önce üzerine tıklamam gerekiyor. Bunu yapıyorum:

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

2) Bundan sonra iyi elementi seçmek zorundayım diyelim Mango.

Ben bunu yapmaya çalıştım inputElementFruits.send_keys(...)ama işe yaramadı.

Yanıtlar:


113

Tıklamanız listenizi doldurmak için bir tür ajax çağrısı başlatmıyorsa, aslında tıklamayı yürütmeniz gerekmez.

İstediğiniz öğeyi seçerek öğeyi bulun ve seçenekleri numaralandırın.

İşte bir örnek:

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

Daha fazla bilgi için:
/sqa/1355/unable-to-select-an-option-using-seleniums-python-webdriver


18
FYI, Selectsınıfı kullanmak sorunu çözmeyi çok daha kolay hale getiriyor, gönderdiğim cevaba bakın.
alecxe

1
Kullanıyorsam ne yapmam gerekir find_by_id? O zaman değeri nasıl sağlarım? Ayrıca, xpathbir öğeyi nasıl bulurum ?
Prakhar Mohan Srivastava

2
@PrakharMohanSrivastava (ve diğerleri) XPath'i bulmak için, kaynağı Chrome dev araçlarında vurguladıysanız, kaynağa sağ tıklayabilir ve o öğenin tam XPath'ini almak için Kopyala -> XPath'ı seçebilirsiniz.
mgrollins

Peki ya metnin adı yoksa? Sadece menüdeki ilk elemanı istiyorum.
ScottyBlades

@ Alecxe'nin cevabında bağlı Select sınıfı , istediğiniz gibi görünen bir select_by_index işlevi sağlar .
alanning

321

Selenyum, yapılarla çalışmak için uygun bir Selectsınıf sağlar 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')

Ayrıca bakınız:


5
Bu gitmek için harika bir yoldur ve fiili yöntem olmalıdır. Ancak, formun yazarı seçili bir HTML öğesini düzgün ayarlamamışsa, daha geniş "xpath" sürümünü kullanmanız gerekebileceğini unutmayın. Yalnızca giriş alanları kullanılıyorsa, xpath çalışmalıdır.
Matthew

1
by_id yerine xpath ile element bulabilir miyiz? İşlev seç?
GigaByte

2
Bu benim için bir giriş olayı tetiklemez :( Ben burada belirtildiği gibi kendim yapmak zorunda: stackoverflow.com/questions/2856513/…
Frederick Nord

1
Çok hoş. Bu, kullandığım bazı kötü kesmek temizledi.
jww

25

önce Select sınıfını içe aktarmanız ve ardından Select sınıfı örneğini oluşturmanız gerekir. Select sınıfı örneğini oluşturduktan sonra, açılır listeden seçenekleri seçmek için o örnekte seçme yöntemleri uygulayabilirsiniz. İşte kod

from selenium.webdriver.support.select import Select

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

14

Umarım bu kod size yardımcı olur.

from selenium.webdriver.support.ui import Select

kimliğine sahip açılır menü öğesi

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

xpath ile açılır öğe

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

css seçici ile açılır öğe

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

Açılır menüden 'Muz'u seçme

  1. Açılır listeyi kullanma

ddelement.select_by_index(1)

  1. Açılır menünün değerini kullanma

ddelement.select_by_value('1')

  1. Açılır menüde görüntülenen metinle eşleşmeyi kullanabilirsiniz.

ddelement.select_by_visible_text('Banana')


Tek bir kod satırı haline getirmenin bir yolu var mı? daha sonra Select? Teşekkürler
Jiraheta

2
bunun gibi tek bir satır kodu yazabilirsiniz. (Driver.find_element_by_id ('id_of_element')) öğesini seçin. Select_by_index (1)
NaramukAbus

7

Çok fazla şey denedim, ancak açılan kutum bir masanın içindeydi ve basit bir seçim işlemi gerçekleştiremedim. Sadece aşağıdaki çözüm işe yaradı. Burada aşağı açılan elem'i vurgulayıp istenen değeri elde edene kadar aşağı ok tuşuna basıyorum -

        #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

Hiçbir şeyi tıklamanız gerekmez. Xpath ile bul veya seçtiğiniz her şeyi kullanın ve ardından gönderme tuşlarını kullanın

Örneğiniz için: 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")

Bu kadar.


3

Bir css seçici kombinasyonu da kullanabilirsiniz

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

Özellik = değer css seçicisindeki 1 değerini istediğiniz meyveye karşılık gelen değere değiştirin.


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)

İyi çalışacak


2

Seçenek değeri ile çalışır:

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

2

Bu şekilde, tüm seçenekleri herhangi bir açılır menüden seçebilirsiniz.

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)

Kullanarak tek tek seçmeye çalışıyorum for items in range(1,input1): inputs.select_by_index(items), ancak ikinci dizinden başlar. İlk değeri nasıl alabilirim?
RxT

1

selenium.webdriver.support.ui.SelectAçılır seçim ile çalışmak için sınıfı kullanmanın en iyi yolu, ancak HTML'nin diğer sorunları veya tasarımı nedeniyle beklendiği gibi çalışmaz.

Bu tür durumlarda execute_script()aşağıdaki gibi alternatif çözüm olarak tercih edebilirsiniz : -

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

Sağlanan HTML'ye göre:

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

Bir seçmek için <option> öğeden öğeSınıf Seç menüsünü kullanmanız gerekir . Dahası,için WebDriverWait indüklemek zorunda element_to_be_clickable().

<option>Metni Mango olarak seçmek için içinaşağıdaki Konum Belirleyici Stratejilerinden birini kullanabilirsiniz :

  • Kimlik özniteliğini ve select_by_visible_text()yöntemini kullanma :

    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-SELECTOR ve select_by_value()yöntemini kullanarak :

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
  • XPATH ve select_by_index()yöntemini kullanarak :

    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. Liste öğesi

genel sınıf 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
Soru açıkça bir Python çözümü istiyor, cevabınız çok takdir ediliyor, ancak Java'da yazıldığı için bu bağlamda gerekli değil.

Üzgünüz ama bu soruda ve etiketlerinde belirtildiği gibi Python değil
Laurent
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.