2016-08-13 5 views
1

Ich versuche, einige Daten aus meinem Selenium Test Report HTML-Datei zu extrahieren.
Ich bekomme zu viele Daten aus der Tabelle der Zeilen und Spalten. Die Daten, die ich extrahieren möchte, sind alle Spalten, die den Klassenwert "testcase" haben und es gibt eine Spalte darunter mit einem Klassenwert "popup_link" und der Text Wert wird Pass oder Fail sagen. Zum BeispielBeautifulSoup extrahiere Daten aus bestimmten Spalten aus einer Tabelle Ich erhalte zu viele Daten

<td class='none'><div class='testcase'>test_000001_login_valid_user</div></td> 
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1')" > 
    pass</a> 

ich den Text „test_000001_login_valid_user“ möchte und den Text „übergeben“

Es gibt viele Testfälle in meinem Bericht ist so würde ich gerne über die Zeilen iterieren und den Testfall Namen raus und der Pass oder Fail-Text.

Mein HTML-Schnipsel ist:

<table id='result_table'> 
<colgroup> 
<col align='left' /> 
<col align='right' /> 
<col align='right' /> 
<col align='right' /> 
<col align='right' /> 
<col align='right' /> 
</colgroup> 
<tr id='header_row'> 
    <td>Test Group/Test case</td> 
    <td>Count</td> 
    <td>Pass</td> 
    <td>Fail</td> 
    <td>Error</td> 
    <td>View</td> 
</tr> 

<tr class='passClass'> 
    <td>Regression_TestCase.RegressionProjectEdit_TestCase.RegressionProject_TestCase_Project_Edit</td> 
    <td>75</td> 
    <td>75</td> 
    <td>0</td> 
    <td>0</td> 
    <td><a href="javascript:showClassDetail('c1',75)">Detail</a></td> 
</tr> 

<tr id='pt1.1' class='hiddenRow'> 
    <td class='none'><div class='testcase'>test_000001_login_valid_user</div></td> 
    <td colspan='5' align='center'> 

    <!--css div popup start--> 
    <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1')" > 
     pass</a> 

    <div id='div_pt1.1' class="popup_window"> 
     <div style='text-align: right; color:red;cursor:pointer'> 
     <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1').style.display = 'none' " > 
      [x]</a> 
     </div> 
     <pre> 

pt1.1: *** test_login_valid_user *** 
test login with a valid user - Passed 


     </pre> 
    </div> 
    <!--css div popup end--> 

    </td> 
</tr> 

<tr id='pt1.2' class='hiddenRow'> 
    <td class='none'><div class='testcase'>test_000002_select_a_project</div></td> 
    <td colspan='5' align='center'> 

    <!--css div popup start--> 
    <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.2')" > 
     pass</a> 

    <div id='div_pt1.2' class="popup_window"> 
     <div style='text-align: right; color:red;cursor:pointer'> 
     <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.2').style.display = 'none' " > 
      [x]</a> 
     </div> 
     <pre> 

pt1.2: *** test_login_valid_user *** 
test login with a valid user - Passed 
*** test_select_a_project *** 
08_12_1612_08_03 
Selenium_Regression_Edit_Project_Test 


     </pre> 
    </div> 
    <!--css div popup end--> 

    </td> 
</tr> 

<tr id='pt1.3' class='hiddenRow'> 
    <td class='none'><div class='testcase'>test_000003_verify_Lademo_CRM_DataPreview_is_present</div></td> 
    <td colspan='5' align='center'> 

    <!--css div popup start--> 
    <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3')" > 
     pass</a> 

    <div id='div_pt1.3' class="popup_window"> 
     <div style='text-align: right; color:red;cursor:pointer'> 
     <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3').style.display = 'none' " > 
      [x]</a> 
     </div> 
     <pre> 

pt1.3: *** test_login_valid_user *** 
test login with a valid user - Passed 
*** test_select_a_project *** 
08_12_1612_08_03 
Selenium_Regression_Edit_Project_Test 
*** Test verify_Lademo_CRM_DataPreview_is_present *** 
aSelenium_LADEMO_CRM_DONOTCHANGE 
File 
498 


     </pre> 
    </div> 
    <!--css div popup end--> 

    </td> 
</tr> 

Mein Code ist:

from bs4 import BeautifulSoup 

table = soup.select_one("#result_table") 

for row in table.select("tr.hiddenRow"): 
     print(" ".join([td.text for td in row.find_all("td")])) 

Wie kann ich erreichen dies bitte?

Danke, Riaz

Antwort

1

prüfen jede Zeile für beide, wenn beide existieren dann den Text extrahieren:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html) 

for row in soup.select("#result_table tr"): 
    div, a = row.select_one("div.testcase"), row.select_one("a.popup_link") 
    if div and a: 
     print(div.text.strip(), a.text.strip()) 

, die Sie gibt:

(u'test_000001_login_valid_user', u'pass') 
(u'test_000002_select_a_project', u'pass') 
(u'test_000003_verify_Lademo_CRM_DataPreview_is_present', u'pass') 

Natürlich, wenn sie gehen immer zusammen wir können vereinfachen zu:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html) 

for div in soup.select("#result_table tr div.testcase"): 
     print(div.text.strip(), div.find_next("a", class_="popup_link").text.strip()) 
+0

Das ist brillant. Ich muss es jetzt nur formatieren, die u weglassen und den Pass genau wie in einer Spalte ausrichten, so dass er in einer netten Linie erscheint. Ich werde dies in einer E-Mail an das Entwickler- und Testteam senden. Danke für Ihre Hilfe. –

+0

@ RiazLadhani, kein Problem, das heißt, es ist ein Unicode-String, wenn Sie wirklich wollten, würden Sie den Unicode mit '.encode (" utf-8 ")' –

+0

wie folgt kodieren: print (div.text. strip(). encode ('utf-8'), div.find_next ("a"). text.strip(). encode ('utf-8')) –

Verwandte Themen