如何在 selenium Python 中使用 onclick 查找元素?

How to find element using onclick in selenium Python?

我的HTML:

<tr>
            <td width="5%" align="center" height="25">&nbsp;1</td>
            <td width="20%" height="25">&nbsp;&nbsp;Mahamoodha Bi H</td>
            <td width="5%" align="center" height="25">&nbsp;356159</td>
            <td width="5%" align="center" height="25">&nbsp;Female</td>
            <td width="10%" align="center" height="25">&nbsp;32 Years</td>
            <td width="15%" align="center" height="25">&nbsp;22/09/2021 03:00 PM</td>
            <td width="15%" height="25">&nbsp;01/10/2021 03:53 PM</td>
            <td width="15%" height="25" align="center">&nbsp;01/10/2021 12:14 PM</td>
            <td width="5%" height="25" align="center">
              <img class="imgButtonStyle" src="../../images/continue.png" onclick="loadDischargeSummaryListDetails('3163','356159',1);" width="20" height="20">
            </td>
        </tr>

我有一个与上面类似的行列表。我需要遍历行并单击每行的最后一列以获取我需要的数据并关闭它们。我是 python 和 selenium 的新手,不知道该怎么做。

唯一唯一的数据是第三列中的数据,这是一个ID号和最后一列“img”标签中的“onclick”值。其他数据在每一行或某些行中重复。

我使用 beautifulsoup 单独收集了这些。

  1. 我能够使用下面的代码找到 ID 号元素,但我不知道如何使用它来单击该行的最后一个元素。

    selection = driver.find_element_by_xpath("//td[contains(text(),'{}')]".format(ID))
    
  2. 我得到了 'onclick' 值,但我不知道如何使用该值搜索可点击元素。我尝试了下面的代码,但它抛出了“InvalidSelectorException”错误。

    selection = driver.find_element_by_xpath("//img[@onclick=\"{}\")]".format(onclick))
    

我被困在这里,不知道如何 select 并单击该元素。

我用下面的代码解决了:

#Select the table 
tab = driver.find_element_by_css_selector('#ipDischargeView > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > table:nth-child(1)')
#Find the total number of rows containing the imgButtonStyle
raw_list = len(tab.find_elements_by_class_name('imgButtonStyle'))
for n in range(0,raw_list):
    
    #freshly search the page each iteration for the same table
    tab = driver.find_element_by_css_selector('#ipDischargeView > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > table:nth-child(1)')

    #Select the particular row from the list
    patient = tab.find_elements_by_class_name('imgButtonStyle')[n]

有没有更简单或更优雅的方法来做到这一点?这看起来相当重复且效率低下

到达最后一列(最后一个列表元素)的一种方法是这样的:

selection = driver.find_elements_by_xpath("//td[contains(text(),'{}')]//parent::tr//td".format(ID))[-1]

通过这行代码,首先确定ID的位置,然后return到tr HTML元素,然后得到最后一个td tr.

既然您已经提到要遍历行,请像下面这样尝试一次:

获取突出显示 table 的所有 tr 标签的定位器。并遍历它们以查找详细信息。

xpath 的开头使用 . 在元素中查找元素。

table = driver.find_elements_by_xpath("xpath for tr tags") # Should highlight all the `tr` tags

for row in table:
    id = row.find_element_by_xpath(".//td[3]").text # Assuming that the 3rd `td` tag contains the ID
    onclick = row.find_element_by_xpath(".//img").get_attribute("onclick") # Gets the value of onclick.