2017-03-06 2 views
1

Ich habe über LINQ gelernt und versuche es zu finden, bestimmte Webelemente auf der Seite mit Selen zu finden.Wie finden Sie ein verschachteltes Selen-WebElement in C# mit LINQ?

Ich habe eine eckige Website, die eine Tabelle aus divs anzeigt. Alle Zeilen in einer Spalte, einschließlich der Kopfzeile, haben dieselben Attribute (z. B. CSS-Selektor/Klassenname usw.).

Ich möchte alle Eingabefelder innerhalb einer Spalte finden, die sichtbar sind, und kam mit dieser ...

var applyBoxes2 = from box in driver.FindElements(By.CssSelector("div.col-apply.col-md-1")) 
        where box.Text != "Apply?" 
        select box; 

var clickableBox = from box in applyBoxes2 
        where box.FindElement(By.TagName("input")).Displayed == true 
        select box.FindElement(By.TagName("input")); 

Die erste Abfrage als erste Zeile erforderlich ist, ist der Kopf, und doesn‘ t enthält ein Eingabefeld. Wenn ich diese Abfrage nicht habe, wird meine zweite Abfrage umfallen, wenn ich versuche, das Suchelement = "input" auszuführen.

Weiß jemand, ob ich diese 2 Aussagen kombinieren kann? Also zuerst würde ich den Header herausfiltern, dann würde ich jedes Eingabefeld innerhalb jedes div finden.

Irgendwelche Gedanken darüber, wie sonst dies verbessert werden könnte, wäre zu begrüßen.

Vielen Dank,

+0

Können Sie nicht die erste erweitern, zum Beispiel. 'where box.Text! =" Übernehmen? "'> '&&' EpicKip

Antwort

3

Verwenden Sie den && Operator, es Kurzschlüsse, wenn es nicht die erste Anweisung nicht besteht. In Ihrem Fall wird es nicht versuchen, ein Element zu finden, wenn der Text Apply? ist.

var clickableBox = from box in driver.FindElements(By.CssSelector("div.col-apply.col-md-1")) 
           where box.Text != "Apply?" && box.FindElement(By.TagName("input")).Displayed == true 
           select box.FindElement(By.TagName("input")); 
1

können Sie verwenden let Klausel, innere Klausel auszuführen.

-Code wird wie folgt sein:

var applyBoxes2 = from box in driver.FindElements(By.CssSelector("div.col-apply.col-md-1")) let clickableBox = box.FindElement(By.TagName("input")) where box.Text != "Apply?" && clickableBox?.Displayed = True select clickableBox;

1

Sie so etwas wie dieses

tun können
var clickableBox = driver.FindElements(By.CssSelector("div.col-apply.col-md-1")) 
    .Where(box => box.Text != "Apply?") 
    .Select(box => box.FindElement(By.TagName("input"))) 
    .Where(boxElement => boxElement.Displayed); 
Verwandte Themen