2011-10-23 43 views
68

Devo selezionare un elemento da un menu a discesa.Selenium - Python - valore opzione menu a discesa

Ad esempio, aprire questo:

<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. Quindi, prima devo cliccarci sopra. Faccio questo:

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

(ok, è l'apertura del menu)

  1. E dopo devo selezionare il buon elemento, consente di dire Mango. Provo una cosa diversa con inputElementFruits.send_keys(...) ma non ha funzionato.

risposta

49

A meno che il clic non stia effettuando una chiamata ajax per popolare l'elenco, in realtà non è necessario eseguire il clic.

Basta trovare l'elemento e quindi enumerare le opzioni, selezionando l'opzione (s) che si desidera.

Ecco un esempio:

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

Si può leggere di più:
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

+7

FYI, l'uso della classe 'Select' rende il problema molto più facile da risolvere, vedere la risposta che ho postato. – alecxe

+0

Cosa devo fare se sto usando 'find_by_id'? Come posso fornire il valore allora? Inoltre, come trovo il 'xpath' di un elemento? –

118

Selenio offre una vantaggiosa Select class di lavorare con select -> option costrutti:

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

Vedi anche:

+0

Questo è un ottimo modo per andare, e dovrebbe essere il metodo de facto. Tuttavia, noterò che potrebbe essere necessario utilizzare la versione più ottusa di "xpath" se l'autore del modulo non ha impostato correttamente un elemento HTML selezionato. Se si utilizzano semplicemente i campi di input, xpath dovrebbe funzionare. – Matthew

0

Il modo migliore per utilizzare selenium.webdriver.support.ui.Select classe a lavorare per la selezione con il menu a discesa, ma un po 'di tempo non funziona come previsto a causa di progettazione di emissione o altre questioni di codice HTML.

In questo tipo di situazione si può anche preferire come soluzione alternativa usando execute_script() come di seguito: -

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

Ho provato un sacco molte cose, ma la mia discesa ero dentro un tavolo e non ero in grado di eseguire una semplice operazione di selezione. Solo la soluzione di sotto ha funzionato. Qui sto evidenziando discesa elem e premendo la freccia fino ad ottenere il valore desiderato -

 #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) 
0
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) 

che funzionerà bene

2

primo luogo è necessario importare la classe Select e quindi è necessario creare il istanza di Seleziona classe. Dopo aver creato l'istanza della classe Seleziona, è possibile eseguire determinati metodi su tale istanza per selezionare le opzioni dall'elenco a discesa. Questo è il codice

from selenium.webdriver.support.select import Select 

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