Python을 사용하여 Selenium으로 드롭 다운 메뉴 값을 선택하는 방법은 무엇입니까?


185

드롭 다운 메뉴 에서 요소를 선택해야 합니다.

예를 들면 다음과 같습니다.

<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(...)작동하지 않았다.

답변:


113

클릭이 목록을 채우기 위해 일종의 아약스 호출을 시작하지 않는 한 실제로 클릭을 실행할 필요는 없습니다.

요소를 찾은 다음 원하는 옵션을 선택하여 옵션을 열거하십시오.

예를 들면 다음과 같습니다.

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

자세한 내용은 /sqa/1355/unable-to-select-an-option-using-seleniums-python-webdriver 에서 확인할 수 있습니다.


18
참고로, Select수업을 사용하면 문제를 훨씬 쉽게 해결할 수 있습니다. 게시 한 답변을 참조하십시오.
— alecxe 2019

1
사용중인 경우 어떻게해야 find_by_id합니까? 그러면 값을 어떻게 제공합니까? 또한 xpath요소를 어떻게 찾 습니까?
— Prakhar Mohan Srivastava

2
@PrakharMohanSrivastava (및 기타)에서 XPath를 찾으려면 Chrome 개발 도구에서 소스를 강조 표시 한 경우 소스를 마우스 오른쪽 버튼으로 클릭하고 복사-> XPath를 선택하여 해당 요소의 전체 XPath를 얻을 수 있습니다.
— mgrollins

텍스트 이름이 없으면 어떻게해야합니까? 메뉴의 첫 번째 요소를 원합니다.
— ScottyBlades

@alecxe의 답변에 연결된 Select 클래스 는 원하는 것처럼 보이는 select_by_index 함수를 제공합니다 .
— alanning

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가 작동합니다.
— Matthew

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)

14

이 코드가 도움이 되길 바랍니다.

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


단일 코드 라인으로 만드는 방법이 있습니까? 변수를 만들고 Select를 적용하는 대신? 감사합니다
— Jiraheta

2
이와 같이 한 줄 코드를 작성할 수 있습니다. 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>

파이썬 :

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 selector의 1을 원하는 fruit에 해당하는 값으로 변경하십시오.


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)

을 사용하여 하나씩 선택하려고 for items in range(1,input1): inputs.select_by_index(items)하지만 두 번째 색인에서 시작합니다. 첫 번째 가치를 어떻게 얻을 수 있습니까?
— 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>with with text를 망고 로 선택하려면 로부터다음 로케이터 전략 중 하나를 사용할 수 있습니다 .

  • 사용하는 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")
  • 사용 XPATH 및 select_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.