2011-01-11 23 views
5

Estoy usando el IWebDriver de Selenium para escribir pruebas unitarias en C#.Usando el IWebDriver de Selenium 2 para interactuar con elementos en la página

Tal es un ejemplo:

IWebDriver defaultDriver = new InternetExplorerDriver(); 
var ddl = driver.FindElements(By.TagName("select")); 

La última línea recupera el elemento select HTML envuelto en una IWebElement.

I necesito una forma de simular la selección de un determinado option en esa lista select pero no puedo encontrar la manera de hacerlo.


Tras algunos research, encontré ejemplos en los que la gente está utilizando la clase ISelenium DefaultSelenium para llevar a cabo lo siguiente, pero no estoy haciendo uso de esta clase porque estoy haciendo todo con IWebDriver y INavigation (de defaultDriver.Navigate()).

También noté que ISelenium DefaultSelenium contiene una tonelada de otros métodos que no están disponibles en las implementaciones concretas de IWebDriver.

Entonces, ¿hay alguna manera de que pueda usar IWebDriver y INavigation junto con ISelenium DefaultSelenium?

Respuesta

7

Como menciona ZloiAdun, hay una hermosa nueva clase Select en el espacio de nombres OpenQA.Selenium.Support.UI. Esa es una de las mejores formas de acceder a un elemento de selección y sus opciones, ya que su API es muy fácil. Digamos que tienes una página web que se ve algo como esto

<!DOCTYPE html> 
<head> 
<title>Disposable Page</title> 
</head> 
    <body > 
     <select id="select"> 
      <option value="volvo">Volvo</option> 
      <option value="saab">Saab</option> 
      <option value="mercedes">Mercedes</option> 
      <option value="audi">Audi</option> 
     </select> 
    </body> 
</html> 

Eres código para acceder al selecto se vería así. Observe cómo creo el objeto Select pasando un IWebElement normal a su constructor. Usted tiene muchos métodos en el objeto Select. Take a look at the source para obtener más información, hasta que se documente correctamente.

using OpenQA.Selenium.Support.UI; 
using OpenQA.Selenium; 
using System.Collections.Generic; 
using OpenQA.Selenium.IE; 

namespace Selenium2 
{ 
    class SelectExample 
    { 
     public static void Main(string[] args) 
     { 
      IWebDriver driver = new InternetExplorerDriver(); 
      driver.Navigate().GoToUrl("www.example.com"); 

      //note how here's i'm passing in a normal IWebElement to the Select 
      // constructor 
      Select select = new Select(driver.FindElement(By.Id("select"))); 
      IList<IWebElement> options = select.GetOptions(); 
      foreach (IWebElement option in options) 
      { 
       System.Console.WriteLine(option.Text); 
      } 
      select.SelectByValue("audi"); 

      //This is only here so you have time to read the output and 
      System.Console.ReadLine(); 
      driver.Quit(); 

     } 
    } 
} 

Sin embargo, hay un par de cosas que destacar sobre la clase de Soporte. Incluso si descargó la última versión beta, la DLL de soporte no estará allí. El paquete de soporte tiene una historia relativamente larga en las bibliotecas de Java (que es donde vive PageObject), pero todavía está bastante fresco en el controlador .Net. Afortunadamente, es muy fácil de construir desde la fuente. I pulled from SVN hizo referencia a WebDriver.Common.dll desde la descarga beta y se creó en C# Express 2008. Esta clase no se ha probado tan bien como algunas de las otras clases, pero mi ejemplo funcionó en Internet Explorer y Firefox.

Hay algunas otras cosas que debo señalar en función de su código anterior.En primer lugar la línea que estaba utilizando para encontrar el elemento select

driver.FindElements(By.TagName("select")); 

va a encontrar todos los elementos selectos. probablemente deberías usar driver.FindElement, sin la 's'.

Además, muy raramente usaría INavigation directamente. Hará la mayor parte de su navegación como driver.Navigate().GoToUrl("http://example.com");

Por último, DefaultSelenium es la forma de acceder a las antiguas aplicaciones de Selenium 1.x. Selenium 2 es una desviación bastante significativa de Selenium 1, por lo que, a menos que intentes migrar pruebas antiguas a la nueva api de Selenium 2 (a menudo referida como la api de WebDriver), no usarás DefaultSelenium.

+0

+1 La clase 'Seleccionar', según lo enlazado por ZloiAdun hizo el trabajo, pero estoy aceptando esta respuesta porque me proporcionó más información. Debido a que 'Seleccionar' aún no está disponible en el dll público, actualmente estoy usando la clase y la excepción vinculada por ZloiAdun. En cuanto a 'FindElements', necesito usar ese porque es más de 1' select' que quiero recuperar. Finalmente, gracias por mencionar el problema con respecto a 'DefaultSelenium', aunque tengo una pregunta para eso; ¿Hay alguna manera de hacer uso de las toneladas de métodos que ofrece 'DefaultSelenium'? –

+0

+1 para aclarar que IWebDriver es el camino a seguir con 2.x. Solo comencé y la mayoría de las demos que pude encontrar usan DefaultSelenium. –

2

Debería obtener todos los elementos option de su select usando ddl.FindElements(By.TagName("option"));. A continuación, puede recorrer la colección de regresar y seleccionar el artículo (s) que requiere el uso de SetSelected método de la IWebElement

actualización: Parece que ahora hay una aplicación C# de la Select en WebDriver - anteriormente era en Java solamente . Por favor, eche un vistazo a su code y es más fácil de usar esta clase

+0

'IWebElement' no tiene un método' SetSelected'. Hay un método llamado 'Seleccionar', pero para mi caso, no está haciendo nada. –

+0

No estoy usando C#, así que puedo perder los nombres de los métodos, lo siento por eso. ¿Has intentado usar OpenQA.Selenium.Support.UI.Select clase? ¿Estás usando Select() en la opción de seleccionar? –

Cuestiones relacionadas