我正在尝试访问具有相同类名和标记的第二或第三Checkbox元素。每个复选框都包含在单独的div中,并且div也具有相同的类名。 我以前曾在stackoverflow和Google上进行过搜索,并尝试了以下一些方法,但是它们都没有起作用
driver.find_element_by_xpath("(//div)[@class='classname value'])[2]")
driver.find_element_by_xpath("(//div[@class='classname value']) [position()=2]")
也
driver.find_element_by_xpath("(//span)[@class='classname value'])[2]")
driver.find_element_by_xpath("(//span[@class='classname value']) [position()=2]")
通过检查,元素看起来是这样的
<div class='a checkbox'>
<label><input type='checkbox'><span class='b'>Paid</span></label>
</div>
<div class='a checkbox'>
<label><input type='checkbox'><span class='b'>Free</span></label>
</div>
我基本上想访问带有自由文本的复选框。我的总体代码是
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://udemy.com/courses/search/?src=ukw&q=python&p=1")
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//span[text()='All Filters']"))).click()
time.sleep(10)
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='modal-body']//label[.//span[@data-purpose='filter-option-title' and text()='Free']]/input[@type='checkbox']"))).click()
答案 0 :(得分:2)
您可以使用contain
,如果 DOM 仅包含一个免费文本,如下例所示。
driver.find_elements_by_xpath("//*[contains(text(), 'Free')]")
如果 DOM 包含多个免费文本,则需要将其传递到 List ,并根据文本位置进行迭代列表。
答案 1 :(得分:0)
修改您的代码,使其看起来像这样:
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://udemy.com/courses/search/?src=ukw&q=python&p=1")
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//button[.//span[text()='All Filters']]"))).click()
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//label[@title and .//span/span[text()='Free']]"))).click()
答案 2 :(得分:0)
尝试使用以下xpath单击udemy帐户上的“免费”复选框。
STRING_AGG
得出 //div[@class='modal-body']//label[.//span[@data-purpose='filter-option-title' and text()='Free']]/input[@type='checkbox']
和WebDriverWait
并遵循XPATH定位符。
element_to_be_clickable()
这是代码。
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='modal-body']//label[.//span[@data-purpose='filter-option-title' and text()='Free']]/input[@type='checkbox']"))).click()
答案 3 :(得分:0)
由于它是一个<input>
元素,可能需要向前移动,因此您需要针对元素 Free 在元素上调用click()
,因此必须诱导 element_to_be_clickable()
的WebDriverWait ,您可以使用以下Locator Strategies中的任何一个:
使用 XPATH 1 :
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='a checkbox']//label//span[@class='b' and text()='Free']//preceding::input[1]"))).click()
使用 XPATH 2 :
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='b' and text()='Free']//preceding::input[1]"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC