2015-04-07 1 views
0

J'utilise Watin pour les tests d'automatisation avec le navigateur IE. Je suis nouveau à Watin. Je me suis bloqué dans une tâche d'obtenir le texte d'en-tête de colonne pour un code table.html pour cette table est quelque chose comme ci-dessous:Comment obtenir du texte d'en-tête de colonne de table dans Watin?

<table id="gvVoiceCallReport" style="width: 100%; border-collapse: collapse; height: 100%;" border="1" rules="all" cellSpacing="0" cellPadding="0"> 
     <tbody> 
      <tr style="background-color: slategray; height: 20px; color: white;"> 
      <th scope="col"> 
      <a style="color: white;" href="javascript:__doPostBack('gvVoiceCallReport','Sort$Caller GCI')"> 
       Text - Caller GCIstyle 
      <th scope="col"> 
       <a style="color: white;" href="javascript:__doPostBack('gvVoiceCallReport','Sort$Callee GCI')"> 
      Text - Callee GCI 
      <th scope="col"> 
       <a style="color: white;" href="javascript:__doPostBack('gvVoiceCallReport','Sort$Originator-Default Bearer Apn')"> 
       Text - Originator-Default Bearer Apn 

      <tr style="cursor: hand;" onmouseover="this.style.cursor='hand';"> 
      <td align="left" onclick="window.open('TestResult.aspx?testSuite=Job.139.1_1504100010110027884023126', 'TestResult', 'height=600,width=900,resizable=yes,scrollbars=yes');"> 
      Text - 310;410;FFFE;9210;B9F 
      <td align="left" onclick="window.open('TestResult.aspx?testSuite=Job.139.1_1504100010110027884023126', 'TestResult', 'height=600,width=900,resizable=yes,scrollbars=yes');"> 
      Text - 310;410;FFFE;9210;B9F 
     .....  
     ...... 
     </table> 

texte d'en-tête de cette colonne est appelant GCI. Je suis en mesure d'obtenir le texte pour les valeurs de cette colonne en utilisant quelque chose comme ça

string columnValueText = mytable.OwnTableRows[1].TableCells[1].Text; 

Quand je suis en train d'obtenir le texte d'en-tête de la colonne en faisant OwnTableRows[0] (indice à zéro), il me donne exception: array hors limites.

N'importe qui, S'il vous plaît aidez-moi à obtenir le texte d'en-tête de colonne de table.

+0

J'ai modifié le code html pour mieux comprendre le contexte. –

Répondre

3
var gridTableRows = page.Document.Frame(Find.ById("ctl00_MainContentPlaceHolder_ifrmReport")).Table("gvVoiceCallReport").TableRows[0]; 
    StringCollection abc = GetAllColumnDataFromRow(gridTableRows, true); 

    private StringCollection GetAllColumnDataFromRow(TableRow tableRow, bool isTableHeaderRow) 
    { 
     StringCollection RowValues = new StringCollection(); 

     if (isTableHeaderRow) 
     { 
      foreach (Element e in tableRow.Elements) 
      { 
       if (e.TagName == "TH") 
       { 
        RowValues.Add(e.Text); 
       } 
      } 
     } 

     return RowValues; 
    } 
+0

Pourriez-vous s'il vous plaît élaborer plus votre réponse en ajoutant un peu plus de description sur la solution que vous fournissez? – abarisone

+0

Comme nous savons l'en-tête est toujours sur l'index = 0. Je viens de diriger la ligne de tête à la fonction GetAllColumnDataFromRow et de vérifier la balise . Si l'étiquette existe. stocker ce texte dans la collection de chaînes. –

+1

Merci pour la solution, Ankit. Cela a fonctionné comme un charme pour moi. –

1

J'ai pris ce morceau de html. Collez-le dans index.html.

Un code que je:

 FireFox ie = new FireFox(@"D:\index.html"); 
     Table tb = ie.Table(Find.ById("gvVoiceCallReport")); 
     if (tb != null) 
     { 
      Debug.WriteLine("Found table!"); 
      var value = tb.Text; 
      TableRow tr = tb.TableRows[0]; 
      Debug.WriteLine(tb.Text);     
      foreach (var elem in tb.Elements) 
      { 
       Debug.WriteLine("Name : {0}, Type : {1}",elem.Name,elem.GetType()); 
       if (elem.GetType().ToString().Equals("WatiN.Core.Link")) 
       { 
        Debug.WriteLine(elem.Text); 
        //elem.Text is current hader; 
       } 
      } 
     } 

et les résultats en sortie de débogage:

Text - Caller GCIText - Caller GCIstyleText - Originator-Default Bearer Apn 
Name : , Type : WatiN.Core.TableBody 
Name : , Type : WatiN.Core.TableRow 
Name : , Type : WatiN.Core.ElementContainer`1[WatiN.Core.Element] 
Name : , Type : WatiN.Core.Link 
Text - Caller GCI 
Name : , Type : WatiN.Core.ElementContainer`1[WatiN.Core.Element] 
Name : , Type : WatiN.Core.Link 
Text - Caller GCIstyle 
Name : , Type : WatiN.Core.ElementContainer`1[WatiN.Core.Element] 
Name : , Type : WatiN.Core.Link 
Text - Originator-Default Bearer Apn 

J'espère que cela a été utile.

+0

Bonjour Zbig K. Merci pour la solution. Cela fonctionne très bien pour obtenir la chaîne de texte de première ligne. Mais encore une fois, le problème est quand nous avons plusieurs colonnes. En obtenant du texte pour Row [0], il donne simplement une chaîne de texte d'en-tête de colonne concaténée avec un délimiteur SPACE. Des suggestions pour obtenir le texte des en-têtes des colonnes sélectionnées pour la première ligne. –

+0

Vous pouvez essayer d'affecter le résultat à une chaîne et créer un tableau en les séparant: string headers = "1 2 3 4 5 6 7"; chaîne [] str = headers.Split (''); et puis foreach –

+0

Belle suggestion, mais le problème est au format de chaîne. Voir ce qui est obtenu à partir du résultat est (appelant GCICallee GCIOriginator-Default Porteur ApnOriginator-IMS Dedicated Bearer Apn) et ce dont j'ai besoin est comme [Caller GCI], [Callee GCI], [Originator-Default Bearer Apn], [Originator- IMS Dedicated Bearer Apn]) type de chaînes. Donc spliting ne m'a pas complètement aidé. –