selenium 如何通过CSS选择器获取当前元素的所有直接子元素?

v8wbuo2f  于 2023-02-08  发布在  其他
关注(0)|答案(2)|浏览(363)

我想用Selenium获取某个特定元素的所有子元素,假设我有以下HTML:

<html>
  <table>
    <tr>
      <td>Test 1</td>
      <td id="123">Test <b>2</b>
        <span>span_text</span>
      </td>
      <td>Test 3</td>
    </tr>
  </table>
</html>

首先,我想通过id找到第二个td元素,然后我想找到它的所有子元素(即b和span元素),找到第二个td元素并不难:

from selenium import webdriver
from selenium.webdriver.common.by import By

page_source = """<table> 
                   <tr>
                        <td>Test 1</td>
                        <td id="123">Test<b>2</b><span>span_text</span></td>
                        <td>Test 3</td>
                   </tr> 
                 </table>
                 """

driver = webdriver.Chrome()
driver.execute_script('document.documentElement.innerHTML=arguments[0]', f"<html>{page_source}</html>")

element = driver.find_element(By.ID, "123")

为了找到子元素,我尝试了td > * CSS选择器:

for elements in element.find_elements(By.CSS_SELECTOR, f"td > *"):
    print(element.tag_name)

但是,这会打印两个td标签,而不是bspan。我还尝试了. > * CSS选择器,但似乎无效。如何在Selenium中通过CSS选择器选择WebElement的所有(直接)子元素?
注意:我想使用element.find_elements()方法,也就是说,我想让selenium只在已经找到的元素中搜索。

sgtfey8w

sgtfey8w1#

你的代码很完美,你只需要跟踪for语句中每次迭代的派生项都被称为 elements,所以你需要调用:

print(elements.tag_name) # instead of element, it should be elements

下面是完整的程序:

page_source = """<table> 
           <tr>
            <td>Test 1</td>
            <td id="123">Test<b>2</b><span>span_text</span></td>
            <td>Test 3</td>
           </tr> 
         </table>
         """

driver = webdriver.Chrome(service=s, options=options)
driver.execute_script('document.documentElement.innerHTML=arguments[0]', f"<html>{page_source}</html>")
element = driver.find_element(By.ID, "123")
for elements in element.find_elements(By.CSS_SELECTOR, f"td > *"):
    print(elements.tag_name)

输出:

b
span
vxbzzdmp

vxbzzdmp2#

您的代码中存在错误:)

for elements in element.find_elements(By.CSS_SELECTOR, f"td > *"):
    print(element.tag_name)
                ^ elements

这应该是elements.tag_name(元素的复数形式),以使用循环变量elements。上一行的变量是element,因此您将上一行的TD打印了两次。
话虽如此,您只需一个步骤就可以做到这一点,从而简化代码并保存一点时间

for element in driver.find_elements(By.CSS_SELECTOR, "[id='123'] > *"):
    print(element.tag_name)

相关问题