Home > database >  How to click a button using Selenium if a cell in row contains certain text
How to click a button using Selenium if a cell in row contains certain text

Time:08-19

I want to click on a button in a row using XPath if the cell within the certain row contains the text Reconciliation.

Below is the html of the website (I cannot share the link because it's an internal website):

<tbody>
<tr >
<th scope="col" style="width:25px;">&nbsp;</th>
<th scope="col" style="width:25px;">&nbsp;</th>
<th scope="col" style="width:25px;">&nbsp;</th>
<th align="center" scope="col" style="width:50px;">ID</th>
<th align="center" scope="col" style="width:200px;">Project</th>
<th align="center" scope="col" style="width:300px;">Task</th>
<th align="center" scope="col" style="width:100px;">Lock</th>
<th align="center" scope="col" style="width:100px;">Person</th>
<th align="center" scope="col" style="width:100px;">First Date</th>
<th align="center" scope="col" style="width:130px;">Second Date</th>
</tr>
<tr>
<td><span><a href="/placeholder/DisplayTask.aspx?taskWflId=UADMERR2-PBIZCAL2-974f892e-eb51-42b7-bef6-6587ec7f76a2&amp;wklist=ADMIN&amp;prjId=12345&amp;prd=1" target="_self"><img src="/sth/open.gif" border="0" alt="Open this task"></a></span></td>
<td><span><a href="/placeholder/DisplayProcessHistory.aspx?prjId=12345&amp;prd=1" target="_blank"><img src="/sth/history.gif" border="0" alt="Show project history"></a></span></td>
<td><span><a href="/placeholder/DisplayProcessStatus.aspx?prjId=12345&amp;prd=1" target="_blank"><img src="/sth/roadmap.gif" border="0" alt="Show project roadmap"></a></span></td>
<td><span><a href="Worklist.aspx?IssueSourceIds=12345" target="_self" style="text-decoration:none">12345</a></span></td>
<td><span>"Product name placeholder"</span></td>
////Referenetial is in the line below
<td><span><span >Reconciliation Error</span><br>A technical error has occured.</span></td>
<td><span></span></td>
<td><span>ADMIN</span></td>
<td><span>01-08-2022</span></td>
<td><span>01-08-2022 13:26:07</span></td>
</tr>
<tr >
<td><span><a href="/placeholder/DisplayTask.aspx?taskWflId=UFUPPUB1-MLOTFUP1-332ce59b-7773-4098-9dd0-0a3ae790dea1&amp;wklist=FOLLOW_UP&amp;prjId=12345&amp;prd=1" target="_self"><img src="/sth/open.gif" border="0" alt="Open this task"></a></span></td>
<td><span><a href="/placeholder/DisplayProcessHistory.aspx?prjId=12345&amp;prd=1" target="_blank"><img src="/sth/history.gif" border="0" alt="Show project history"></a></span></td>
<td><span><a href="/placeholder/DisplayProcessStatus.aspx?prjId=12345&amp;prd=1" target="_blank"><img src="/sth/roadmap.gif" border="0" alt="Show project roadmap"></a></span></td>
<td><span><a href="Worklist.aspx?IssueSourceIds=12345" target="_self" style="text-decoration:none">12345</a></span></td>
<td><span>"Product name placeholder"</span></td>
<td><span><span >Issue Follow Up</span><br>Summary &amp; Status.<br>Concerned issue: "Product name placeholder"</span></td>
<td><span></span></td>
<td><span>FOLLOW_UP</span></td>
<td><span>01-08-2022</span></td>
<td><span>29-07-2022 10:05:07</span></td>
</tr>
<tr>
<td><span><a href="/placeholder/DisplayTask.aspx?taskWflId=UFUPADM1-MLOTFUP1-d02d29e7-f2c7-4a1c-9313-62ff652c1aa4&amp;wklist=ADMIN&amp;prjId=12345&amp;prd=1" target="_self"><img src="/sth/open.gif" border="0" alt="Open this task"></a></span></td>
<td><span><a href="/placeholder/DisplayProcessHistory.aspx?prjId=12345&amp;prd=1" target="_blank"><img src="/sth/history.gif" border="0" alt="Show project history"></a></span></td>
<td><span><a href="/placeholder/DisplayProcessStatus.aspx?prjId=12345&amp;prd=1" target="_blank"><img src="/sth/roadmap.gif" border="0" alt="Show project roadmap"></a></span></td>
<td><span><a href="Worklist.aspx?IssueSourceIds=12345" target="_self" style="text-decoration:none">12345</a></span></td>
<td><span>"Product name placeholder"</span></td>
<td><span><span >Issue Follow Up ADMIN</span><br>Summary, Status &amp; Admin Tools.<br>Concerned issue: "Product name placeholder"</span></td>
<td><span></span></td>
<td><span>ADMIN</span></td>
<td><span>01-08-2022</span></td>
<td><span>29-07-2022 10:05:07</span></td>
</tr>
</tbody>

May I ask how could this be achieved?

CodePudding user response:

If you want to click on the element by substring of text, you can use text() selector

Below gives you element that contains text Reconciliation

element = driver.find_element(by=By.XPATH,value="//*[text()[contains(.,'Reconciliation')]]")
element.click()

CodePudding user response:

I would do something like the following. It will dynamically find the "Reconciliation" text in a row even when the table might contain more or less rows than you posted. It will then click the first link, under ID, in the same row.

table = driver.find_element_by_tag_name("table")
rows = table.find_elements_by_tag_name("tr")

for row in rows:
    if row.get_attribute("class") != "header": # skip the header row
    
        # get the contents of the span
        spanContent = row.find_element_by_css_selector("td:nth-of-type(6) > span").get_attribute("innerHTML")
        
        if (spanContent.find("Reconciliation") != -1): # find the text, -1 is not found
            # click the first link (ID) in this row
            row.find_element_by_css_selector("td:nth-of-type(1) > span > a > img").click()
            
            break

CodePudding user response:

The <td> containing the text Reconciliation is:

<td>
    <span>
        <span >Reconciliation Error</span>
        <br>
        A technical error has occured.
    </span>
</td>

To click on the element you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following locator strategies:

  • Clicking <span>:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//td/span[.//span[contains(., 'Reconciliation')]]"))).click()
    
  • Clicking <td>:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//td[./span[.//span[contains(., 'Reconciliation')]]]"))).click()
    
  • Note: You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Related