Estoy tratando de acceder a un segundo o tercer elemento de casilla de verificación que tiene el mismo nombre de clase y etiqueta ... Cada casilla de verificación está encerrada en un div separado y el div también tiene el mismo nombre de clase. Anteriormente busqué en stackoverflow y Google e intenté algunos de los siguientes, pero ninguno de ellos funciona

driver.find_element_by_xpath("(//div)[@class='classname value'])[2]")
driver.find_element_by_xpath("(//div[@class='classname value']) [position()=2]")  

Además

driver.find_element_by_xpath("(//span)[@class='classname value'])[2]")
driver.find_element_by_xpath("(//span[@class='classname value']) [position()=2]")

Así es como se ven los elementos por inspección

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

Básicamente quiero acceder a la casilla de verificación con Texto libre ... Mi código general es este

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
Joe Ann 30 sep. 2019 a las 16:34

3 respuestas

La mejor respuesta

Modifique su código para que se vea así:

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()
0
Alexey R. 30 sep. 2019 a las 17:37

Puede usar contain si el DOM solo contiene un texto Gratis como se muestra a continuación.

driver.find_elements_by_xpath("//*[contains(text(), 'Free')]")

Si el DOM contiene varios textos Gratis , entonces debe pasarlo a Lista y, según la posición del texto, debe iterar el Lista .

2
stacktome 30 sep. 2019 a las 13:58

Pruebe el siguiente xpath para hacer clic en la casilla de verificación Gratis en la cuenta de udemy.

 //div[@class='modal-body']//label[.//span[@data-purpose='filter-option-title' and text()='Free']]/input[@type='checkbox']

Induce WebDriverWait y element_to_be_clickable() y el siguiente localizador XPATH.

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()

Aquí está el código.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver=webdriver.Chrome("path of the chrome driver")
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()
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
KunduK 30 sep. 2019 a las 14:47
58169026