2012-03-07 32 views
8

Tengo un control de selección en mi sitio. Estoy usando objetos de página para interactuar con la página. Si lo hago (con las 2 primeras líneas en mi clase y la selectByValue en mi método)elemento selectivo de Selenium webdriver

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

foo.selectByValue("myValue"); 

falla con un puntero nulo. También lo intenté sin el @FindBy.

si hago esto en mi método funciona todo bien y se selecciona el elemento correcto

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

Aquí es el fragmento real de la web para que el control (editado para proteger a los inocentes)

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

Déjeme decir que tengo un problema para mi problema pero No entiendo por qué la ruta "normal" no funciona.

Respuesta

17

Eso es porque la clase Select tiene este constructor:

Select(WebElement element) 

Ver el Javadoc

Así que si haces algo como esto:

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

debería funcionar.

Por cierto, estoy utilizando el mismo enfoque que en la "solución" porque no quiero lanzar un nuevo objeto WebElement cuando necesito el objeto Seleccionar. Pero de todos modos, los

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

vuelve WebElement, así que por eso su trabajo. También puede hacer esto:

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

ahh que tiene sentido sólo parecía que debería haber trabajado por lo que nunca realmente cavado a lo profundo Mi culpa. Gracias – ducati1212

+0

Nota: si incluye la declaración Select y el lanzamiento en su clase, justo debajo de la declaración privada de WebElement, obtendrá errores de tiempo de ejecución cuando se crea una instancia de la clase; para evitar esto, puede poner la declaración Seleccionar y la clase en el método que hace la interacción con el control de pantalla. Una vez más, no es ideal, pero parece funcionar. –

+0

con este enfoque, los objetos de página se deben inicializar después de que la página se haya cargado completamente y que el objeto esté presente y visible en el controlador. Para obtener un proxy, echa un vistazo a [mi implementación] (http://stackoverflow.com/questions/35931667/select-object-on-seleniums-pagefactory/36004572#36004572) – rrw

2

Hay dos formas de seleccionar el valor de opción:

Uno:

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

Dos:

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

y select.selectByIndex (intValue) – dmeehan

1

Otra forma en que Esto se consigue utilizando el método below para todos mis cuadros de selección desplegable onchange. Pase Identificación y selección y funciona

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); 
    } 

Haciendo arriba y abajo estamos initialzing el guión onchange .......

Cuestiones relacionadas