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()
我正在尝试使用 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()