簡體   English   中英

Selenium 從整個頁面中查找元素,而不僅僅是其中的一部分(Python)

[英]Selenium finds element from the entire page instead of just a part of it (Python)

我有一個像這樣的 html 元素:

<table>
   <tbody>
      <tr>
         <td>My Text</td>
         <td>Some Other Text</td>
         <td><img src="../delete.png" alt="trashcan"></td>
      </tr>
      <tr>
         <td>More Text</td>
         <td>Some More Text</td>
         <td><img src="../delete.png" alt="trashcan"></td>
      </tr>
   </tbody>
</table>

我想按文本查找表格行,然后單擊垃圾桶圖標將其刪除。

所以我的想法是遍歷行<tr/>然后遍歷單元格<td/> 如果文本與單元格文本匹配,則通過XPATH從該行中查找圖像,然后單擊它。

tbody = driver.find_element_by_tag_name("tbody")
tr = tbody.find_elements_by_tag_name("tr")
for row in tr:
   td = row.find_elements_by_tag_name("td")
   print(len(td))
   for cell in td:
     if cell.text == "More Text":
       delete = row.find_element_by_xpath('//img[@alt="trashcan"]')
       delete.click()

我的理解是driver是整個頁面。 tbody只是該頁面中的 tbody 元素。 因此,無論我試圖從那里找到什么,都必須是該元素的子元素。 為了確認我打印出打印出“3”的td元素的長度。

刪除按鈕delete = row.find_element_by_xpath('//img[@alt="trashcan"]')從表格的第一行而不是第二行中選擇刪除按鈕。

我也試過

delete = row.find_elements_by_xpath('//img[@alt="trashcan"]')
delete[0].click()

但它也選擇行。

只是為了確保我在 if 條件中print(row.get_attribute("innerHTML"))print(row.get_attribute("innerHTML"))並打印出第二行。

任何想法發生了什么或者我如何選擇第二行中的img

您可以使用 text() 方法找到正確的 XPath,如下所示:

//td[contains(text(),'Some More Text')]/../td[3]

或者:

//td[contains(text(),'Some More Text')]/parent::tr/td[3]

第一個只是向上一級,然后查找第三個 td 元素。

第二種方法查找父元素,就像這里描述的XPath: Get parent node from child node

嘗試將其應用到您的循環中。

find_element_by_xpath只會給你它找到的第一條路徑。

我不確定您對 JavaScript 有多熟悉,但我傾向於使用find_elements_by_css_selector 然后,它允許您輸入與運行document.querySelectorAll時相同的參數。

在你的情況下,你可以這樣做:

text_to_find = 'If this is spotted, then delete'
# Find all tds
trs = driver.find_elements_by_css_selector("td")
# Iterate over each tr insde a td.
for tr in trs:
    for td in tr.find_elements_by_css_selector('tr'):
        # If any td text is equal to the text you wish to delete, then click on the trashcan and then move onto the next td.
        if td.text == text_to_find:
            tr.find_element_by_css_selector("[alt='trashcan']").click() # notice that I removed the 's' in elements.
            break

您可以嘗試更改 for 循環。 就像for i in range(1,len(tr)):它跳過第一個tr 或者您可以在 for 循環之前pop tr的第一個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM