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")
  • 사용 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.