2017-05-24 1 views
1

Ich versuche, einen Link in einer Tabelle zu finden, die in der Spalte 1 von Daten in Spalte 11Selen C# find Link in Tabelle

Nach viel Jagd positioniert ist um ich habe folgende snippit von Code für meine Bedürfnisse angepasst gefunden

 IWebElement table = driver.FindElement(By.XPath("//*[@id='NewBusinessDetailRecords']")); 
     IList <IWebElement> rows = table.FindElements(By.TagName("tr")); 

     foreach (IWebElement row in table) 
     { 
      rows = table.FindElements(By.TagName("tr")); 
      IList<IWebElement> cells = row.FindElements(By.TagName("td")); 
      if (cells[10].Text.Equals("103")) 
      { 
       cells[0].Click(); 
      } 
     } 

jedoch die foreach-Anweisung funktioniert nicht in der Tabelle hervorgehoben mit Fehler

foreach-Anweisung kann nicht auf Variablen vom Typ ‚OpenQA.Selenium.IWebElement‘ arbeiten, weil ‚OpenQA.Sele nium.IWebElement GetEnumerator ‚‘ keine öffentliche Definition für enthalten‘

Mehrere Beiträge vorschlagen, ich brauche IEnumerable zu verwenden (auch einige, die dies vorschlagen automatisch sein sollte), aber ich habe es nicht geschafft, diese zu erarbeiten umzusetzen in meinen Code.

Jede Hilfe

EDIT geschätzt:

Beispiel HTML 1 Tabellenzeile

<table id="NewBusinessDetailRecords" cellspacing="0" style="width:100%;" class="listviewgrid"> 
<thead> ... </thead>  
<tbody>   
<tr id="0" class="datagriddetail">  
<td style="text-align: center">    
<a href="" accesskey="1" style="cursor: pointer; cursor: hand;" onclick="CopyNewBusinessDetailRecord(0, 0, 1083406, 14436); return false;" title="Matched to Invoice with ID = 14436; Client with ID = 1083406"><img src="../../images/icons/invoice.png" border="0"></a>    </td>   
<td> Test1 Case1 </td>  
<td> Invoice </td>  
<td> GBP </td>  
<td style="text-align: right"> 600.00 </td>  
<td> 0% </td>  
<td style="text-align: right"> 600.00 </td>  
<td> </td>  
<td> Company Name </td>  
<td> UserName</td>  
<td> 103 </td>  
<td> </td>  
<td> </td>  
<td> </td>  
<td style="text-align: center">   </td>  
</tr>  <tr id="0" class="datagriddetail">  

Antwort

0

Sie möchten für jede <tr> in <table> iterieren. Sie sollten durch rows werden iteriert, nicht table:

foreach (IWebElement row in rows) 

Auch Sie werden diese Fremd Linie entfernen müssen: rows = table.FindElements(By.TagName("tr"));. Einmal "innerhalb" der foreach-Schleife enthält die row Variable die zu verarbeitende <tr>IWebElement.


Basierend auf Ihren HTML-Beispiel, ich habe auch ein paar Vorschläge:

  • Ich möchte vermeiden, XPath verwenden, wenn möglich. In Ihrem Fall wählen Sie einfach nach der ID aus.

    IWebElement table = driver.FindElement(By.Id("NewBusinessDetailRecords")); 
    
  • Validierung hinzufügen, bevor cells Indizierung. Dies verhindert die ArgumentOutOfRangeException.

    if (cells.Count > 10 && cells[10].Text.Equals("103")) 
    

Voll Code:

IWebElement table = driver.FindElement(By.Id("NewBusinessDetailRecords")); 
IList<IWebElement> rows = table.FindElements(By.TagName("tr")); 

foreach (IWebElement row in rows) 
{ 
    IList<IWebElement> cells = row.FindElements(By.TagName("td")); 
    if (cells.Count > 10 && cells[10].Text.Equals("103")) 
    { 
     cells[0].Click(); 
    } 
} 
+0

Das funktioniert perfekt! – Smithy7876

1

Sie haben diesen Fehler, da foreach nur arbeitet mit IEnumerable Typen

foreach (IWebElement row in table) würde auf jeden Fall scheitern, weil tableist 0 und es ist offensichtlich ein einzelnes Objekt.

Was Sie hier brauchen, ist nur unnötige foreach Schleife entfernen, wie diese (Zeile 0 Spalte 10):

var row = driver.FindElement(By.CssSelector("table#NewBusinessDetailRecords tr#0")); 
var cells = row.FindElements(By.TagName("td")).ToList(); 
if (cells[10].Text.Equals("103")) 
{ 
    cells[10].Click(); 
} 

ich dir nicht sicher sagen kann, weil ich HTML-Code, der nicht haben Element müssen Sie klicken, aber ich denke, dass alle Code mit dieser ersetzt werden kann:

driver.FindElement(By.LinkText("103")).Click(); 

, wenn Sie oder wollen Sie nur einen Teil der Linktext angeben:

driver.FindElement(By.PartialLinkText("10")).Click(); 
+0

Diese Lösung ist nicht für mich arbeiten, wie ich eine ArgumentOurOfRangeExpection auf der Linie, wenn ich immer. Ich füge ein Beispiel HTML zu meiner Frage an – Smithy7876

+0

Ich konnte Verbindungscode in HTML nicht finden. Ich denke, es sieht wie 103 aus. In diesem Fall sollte das letzte Code-Snippet funktionieren: driver.FindElement (By.LinkText ("103")). Klicken Sie auf() ;. –

+0

Der Link ist in die Smithy7876