如何访问具有相同类名和标签的第二个复选框?

时间:2019-09-30 13:34:07

标签: python selenium selenium-webdriver xpath webdriverwait

我正在尝试访问具有相同类名和标记的第二或第三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()

4 个答案:

答案 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