2012-04-13 15 views
6

Estoy usando Selenium WebDriver Extensions en C# para seleccionar un valor de una lista de selección por un valor de texto parcial (el real tiene un espacio delante) . No puedo hacer que funcione usando una coincidencia de texto parcial. ¿Estoy haciendo algo mal o es esto un error?Usar SelectByText (parcial) con C# Selenium WebDriver no parece funcionar

ejemplo reproducible:

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium.Support.UI; 

namespace AutomatedTests 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void TestMethod1() 
     { 
      var driver = new FirefoxDriver(); 
      driver.Navigate().GoToUrl("http://code.google.com/p/selenium/downloads/list"); 
      var selectList = new SelectElement(driver.FindElement(By.Id("can"))); 
      selectList.SelectByText("Featured downloads"); 
      Assert.AreEqual(" Featured downloads", selectList.SelectedOption.Text); 
      selectList.SelectByValue("4"); 
      Assert.AreEqual("Deprecated downloads", selectList.SelectedOption.Text); 
      driver.Quit(); 
     } 
    } 
} 

Proporciona error: OpenQA.Selenium.NoSuchElementException: Cannot locate element with text: Featured downloads

+0

¿Has probado SelectByText ("Descargas destacadas")? Estoy bastante seguro de que ninguna de las fijaciones elimina el espacio en blanco de la cuerda. – jarib

+0

Sí, lo había intentado y funciona. –

+0

Pero me gustaría seleccionar por subcadena, que aparentemente este método admite, según la documentación del método. –

Respuesta

6

El método SelectByText se rompe, por lo que escribió mi propio método de extensión llamado SelectBySubText para hacer lo que se pretende hacer.

using System.Linq; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Support.UI; 

namespace AutomatedTests.Extensions 
{ 
    public static class WebElementExtensions 
    { 
     public static void SelectBySubText(this SelectElement me, string subText) 
     { 
      foreach (var option in me.Options.Where(option => option.Text.Contains(subText))) 
      { 
       option.Click(); 
       return; 
      } 
      me.SelectByText(subText); 
     } 
    } 
+0

Hola Alister, esta es una gran extensión y exactamente lo que estaba buscando. Sin embargo, esta es mi primera vez con las extensiones de Selenium y no estoy seguro de cómo llamarlo. ¿Debo esperar verlo en VS como mySelect.SelectBySubText (subtítulo)? – bearaman

+0

@bearaman sí, una vez que tenga una declaración de uso para su clase, debería simplemente llamarla desde el Elemento seleccionado como de costumbre –

0

Si puede reproducir el problema en una página HTML simple que sin duda debe presentar un informe de error.

Mirando el source codeSelectByText hace esto primero:

FindElements(By.XPath(".//option[normalize-space(.) = " + EscapeQuotes(text) + "]")) 

y si no encuentra nada, entonces hace esto:

string substringWithoutSpace = GetLongestSubstringWithoutSpace(text); 
FindElements(By.XPath(".//option[contains(., " + EscapeQuotes(substringWithoutSpace) + ")]")) 

Así que en teoría debería funcionar. También puede jugar con el XPath usted mismo y ver si puede lograr que funcione en su caso.

+0

Gracias: escribí una solución para esto (ver otra respuesta). –

Cuestiones relacionadas