Python 硒阵列

Python Selenium Array

我正在尝试使用 selenium-webdriver 检查数组中的所有复选框。但我正在努力寻找正确的 methods/functions,不知何故,整个代码非常混乱。

我有一个或多个像这样的数据箱:

<div class="data_row">
<span id="checkbox_detail_ONE" class="checkbox_detail">
<input type="checkbox" value="dir://TEST" name="file_list" onclick="check_enable_btn()">

我想从中选中除名为 checkbox_detail_ONE

之外的所有复选框

在 python 中我尝试了这个,但我猜这是对 driver.find_elements_by_xpath():

的误解
for i in driver.find_elements_by_xpath("//span[@class='checkbox_detail']"):
    if "ONE" in i.text:
        print "Keep "
    else: 
        print "Delete"
        i.click()

您可以使用 xpath 一次性获取除 "checkbox_detail_ONE" 之外的所有复选框:

driver.find_elements_by_xpath("//span[@class = 'checkbox_detail' and @id != 'checkbox_detail_ONE']")

这将 return 所有 span 元素,但具有 "checkbox_detail_ONE" 名称的元素除外。

如果你需要从这里获取input个元素,你可以使用following-sibling:

//span[@class = 'checkbox_detail' and @id != 'checkbox_detail_ONE']/following-sibling::input

在尝试了您的代码的各个部分之后,它们似乎在大多数情况下都有效。您的问题可能出在排除 check_detail_ONE 复选框。 i.text returns 元素中包含的文本,但从您发布的代码来看,没有任何内容让我相信复选框将在其文本中包含一个。 对于您的排除,您将需要使用 selection 专门 select 此复选框。 Selenium 通过 ID 支持 selection,因此您可以使用以下内容:

driver.find_element_by_id("checkbox_detail_ONE")

或者如果您更喜欢使用 xpath:

driver.find_element_by_xpath("@id='checkbox_detail_ONE'")

如果你真的想确保它是一个跨度:

driver.find_element_by_xpath("//span[@id='checkbox_detail_ONE']")

这将导致以下代码:

for i in driver.find_elements_by_xpath("//span[@class='checkbox_detail']"):
    if i == driver.find_element_by_xpath("//span[@id='checkbox_detail_ONE']"):
        print "Keep "
    else: 
        print "Delete"

现在,由于我们要选中复选框,它们是单独的元素,我们需要 比较输入元素而不是它们包含的跨度。我们可以 select 通过使用 xpath 的 /descendant:: 功能,导致以下最终代码:

for i in driver.find_elements_by_xpath("//span[@class='checkbox_detail']/descendant::input"):
    if i == driver.find_element_by_xpath("//span[@id='checkbox_detail_ONE']/descendant::input"):
        pass # no action required
    else: 
        i.click()