2012-04-13 6 views
6

Sto utilizzando le estensioni Selenio WebDriver in C# per selezionare un valore da un elenco di selezione con un valore di testo parziale (l'effettivo ha uno spazio davanti) . Non riesco a farlo funzionare utilizzando una corrispondenza di testo parziale. Sto facendo qualcosa di sbagliato o si tratta di un bug?Uso di SelectByText (parziale) con C# Selenium I collegamenti WebDriver non sembrano funzionare

esempio riproducibile:

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

Fornisce errore: OpenQA.Selenium.NoSuchElementException: Cannot locate element with text: Featured downloads

+0

Hai provato SelectByText ("Download in primo piano")? Sono abbastanza sicuro che nessuno dei vincoli toglie lo spazio bianco dalla stringa. – jarib

+0

Sì, l'ho provato e funziona. –

+0

Ma vorrei selezionare per sottostringa, che apparentemente questo metodo supporta, secondo la documentazione del metodo. –

risposta

6

Il SelectByText metodo è rotto, così ho scritto il mio metodo di estensione chiamato SelectBySubText di fare ciò che si intende fare.

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

Ciao Alister, questa è una grande estensione e esattamente quello che stavo cercando. Tuttavia, questa è la mia prima volta con le estensioni Selenium e non sono sicuro di come chiamarlo. Dovrei aspettarmi di vederlo apparire in VS come mySelect.SelectBySubText (sottotesto)? – bearaman

+0

@bearaman si, una volta che hai un'istruzione using per la tua classe, dovresti semplicemente chiamarla dall'elemento Select come da normale –

0

Se è possibile riprodurre il problema in una semplice pagina HTML si dovrebbe assolutamente presentare un bug report.

Guardando il source codeSelectByText fa questo prima:

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

e se non trova nulla, allora fa questo:

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

Quindi, in teoria dovrebbe funzionare. Puoi anche giocare con l'XPath e vedere se riesci a farlo funzionare nel tuo caso.

+0

Grazie: Ho scritto una soluzione alternativa per questo (vedi altra risposta). –

Problemi correlati