2013-05-29 11 views
7

Come scrivere lo stesso pezzo di codice in C#?Elenco di elementi in Selenium WebDriver con C#

List<WebElement> displayedOptions = driver.FindElements(By.TagName("select")); 
for (WebElement option : displayedOptions) 
{ 
    if (option.displayed) 
    { 
     displayedOptions.Add(option); 
    } 
} 

risposta

9

v'è una classe creata appositamente per select elementi HTML (cioè gli elenchi a discesa).

È la classe SelectElement all'interno dello spazio dei nomi OpenQA.Selenium.Support.UI.

Questo è un wrapper attorno agli elementi select, che fornisce un facile accesso alle cose comuni che le persone usano/interagiscono con gli elementi select.

tuo esempio potrebbe essere tradotto in (utilizzando C# 3 o superiore, dal momento che sto utilizzando LINQ):

IList<IWebElement> selectElements = driver.FindElements(By.TagName("select")); 
var displayedSelectElements = selectElements.Where(se => se.Displayed); 

E 'importante sapere che cosa fa questo codice. Per prima cosa trovare tutti gli elementiselect e inserirli in una nuova lista.

Sarà quindi filtrare quelli fuori, solo ai select elementi che vengono visualizzati, vale a dire, la loro proprietà è .Displayedvero. Questa è una traduzione diretta del tuo codice di esempio.

Tuttavia, non hai davvero specificato ciò che si sta cercando di fare, e penso che l'esempio è più adatto come questo:

var selectElement = new SelectElement(driver.FindElement(By.Id("something"))); 
var displayedOptions = selectElement.Options.Where(o => o.Displayed); 

È possibile che questo avrebbe trovato un specificiselect elementi, e il filtro le opzioni all'interno di che select solo a quelle che vengono visualizzate. Anche in questo caso, hanno la loro proprietà .Displayed come true.

Modifica

Dal momento che il codice di cui sopra è quello che ti serve, ma si desidera nella forma di un anello for, una cosa simile sarebbe simile:

var selectElement = new SelectElement(driver.FindElement(By.Id("something"))); 
var allOptions = selectElement.Options; 

for (int i = 0; i < allOptions.Length; i++) 
{ 
    if (allOptions[i].Displayed) 
    { 
     // do something 
     // like add to a new list? 
    } 
} 
+0

Il secondo codice funziona per me. Grazie. – jessica

+0

Ma posso usare lo stesso formato di per in C# invece di foreach? – jessica

+0

@jessica, assolutamente, ho modificato il mio post per dimostrarlo - fammi sapere se non è ancora chiaro. – Arran

1

FindElements ritorna ReadOnlyCollection. Quindi, è meglio definire

ReadOnlyCollection<IWebElement> displayedOptions = driver.FindElements(By.TagName("select")); 

for (WebElement option : displayedOptions) 
{ 
    if (option.displayed) 
    { 
    //displayedOptions.Add(option); //You can't do that 
    // do something else 
    } 
} 
0

Se i dati in formato SVG è simile al seguente:

<div id="content-data" class="col-md-12" style="height:666px;"> 
    <svg id="pie-draw-488172" width="492" height="616"><g transform="translate(226,318)"> 
    <text id="pie-text" cursor="default" y="-226" x="241">Compute (227,311)</text> 
    <text id="pie-text" cursor="default" y="-211" x="241">Database (98,005)</text> 
    <text id="pie-text" cursor="default" y="-196" x="241">Storage&amp;Content Delivery (69,436)</text> 
    <text id="pie-text" cursor="default" y="-181" x="241">Networking (30,874)</text> 
    <text id="pie-text" cursor="default" y="-166" x="241">Other (11,273)</text> 
    </svg> 
</div> 

quindi utilizzare questo

public List<IWebElement> content_data = new List<IWebElement>(); 
content_data = driver.FindElement(By.Id("content-data")).FindElements(By.TagName("text")).ToList(); 
Problemi correlati