2012-03-07 11 views
8

Ho un controllo di selezione sul mio sito. Sto usando gli oggetti della pagina per interagire con la pagina. Se faccio (con le prime 2 righe sotto la mia classe e la selectByValue nel mio metodo)selenio web select select

@FindBy(id="foo") 
private Select foo; 

foo.selectByValue("myValue"); 

Non riesce con un puntatore nullo. Ho anche provato senza lo @FindBy.

Ora, se faccio questo nel mio metodo tutto funziona bene e seleziona la voce corretta

Select foo = new Select(sDriver.findElement(By.id("foo"))); 
foo.selectByValue("myValue"); 

Ecco il frammento di effettiva web per il controllo (a cura di proteggere gli innocenti)

<select id="foo" name="service_name"> 
    <option selected="selected" value="one">one</option> 
    <option value="two">two</option> 
    <option value="three">three</option> 
</select> 

Lasciatemi dire che ho un problema con il mio numero ma Non capisco perché il percorso "normale" non funzioni.

risposta

17

Quello è perché la classe Select ha questo costruttore:

Select(WebElement element) 

Vedere il Javadoc

Quindi, se si fa qualcosa di simile:

@FindBy(id="foo") 
private WebElement wannabeSelect; 
Select realSelect = new Select(wannabeSelect); 
realSelect.selectByValue("myValue"); 

dovrebbe funzionare.

BTW, sto usando lo stesso approccio di voi nella "soluzione alternativa" perché non voglio lanciare il nuovo oggetto WebElement quando ho bisogno di Seleziona oggetto. Ma comunque, i

sDriver.findElement(By.id("foo")); 

rendimenti WebElement, di modo che è il motivo per cui il suo funzionamento. È anche possibile fare questo:

WebElement wannabeSelect = sDriver.findElement(By.id("foo")); 
Select foo = new Select(wannabeSelect); 
+0

ahh che ha senso mi sembrava come dovrebbe avere lavorato così non ho mai veramente scavato in profondità. Colpa mia. Grazie – ducati1212

+0

Nota: se si include la dichiarazione Select e il cast nella classe, appena sotto la dichiarazione WebElement privata, si otterranno errori di runtime quando la classe viene istanziata; per evitare ciò, è possibile inserire la dichiarazione e la classe Select nel metodo che interagisce con il controllo dello schermo. Anche in questo caso non è l'ideale, ma sembra funzionare. –

+0

con questo approccio, i pageobjects devono essere inizializzati dopo che la pagina è stata caricata completamente e che l'oggetto è presente e visibile nel driver. Per avere un proxy, dai un'occhiata a [la mia implementazione] (http://stackoverflow.com/questions/35931667/select-object-on-seleniums-pagefactory/36004572#36004572) – rrw

2

Ci sono due modi per selezionare il valore dell'opzione:

One:

// Denotes option value - technical name 
select.selectByValue(fieldValue);  

Due:

// Denotes option text that is actually visible to be selected 
select.selectByVisibleText(fieldValue); 
+0

e seleziona.selectByIndex (intValue) – dmeehan

1

altro senso che raggiunto questo è utilizzando il metodo sottostante per tutte le mie caselle di selezione a discesa onchange. Passare id e la selezione e funziona

public void onchangedropdownselection(String object, String value) { 
     driver.findElement(By.id(object)).sendKeys(value); 
     driver.findElement(By.id(object)).sendKeys(Keys.UP); 
     driver.findElement(By.id(object)).sendKeys(Keys.DOWN); 
    } 

facendo su e giù stiamo initialzing lo script onchange .......