Как получить доступ ко 2-му флажку, которые имеют одинаковое имя класса и тег? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь получить доступ ко 2-му или 3-му элементу флажка с тем же именем класса и тегом. Каждый из флажков заключен в отдельный элемент 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 ]

2 голосов
/ 30 сентября 2019

Вы можете использовать contain Если DOM содержит только один Свободный текст, как показано в примере ниже.

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

Если DOM содержит несколько свободных текстов, затем вам нужно передать его в List , и в зависимости от позиции текста вам нужно выполнить итерацию List .

0 голосов
/ 30 сентября 2019

Поскольку это <input> элемент, предположительно движущийся вперед, вам нужно вызвать click() для элемента относительно текста Свободно , вам нужно вызвать WebDriverWait дляelement_to_be_clickable(), и вы можете использовать любую из следующих стратегий локатора :

  • Использование 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
    
0 голосов
/ 30 сентября 2019

Попробуйте следующий xpath, чтобы установить флажок Free в учетной записи udemy.

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

Индуцировать WebDriverWait и element_to_be_clickable() и следующий локатор 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()

Вот код.

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 голосов
/ 30 сентября 2019

Измените ваш код так, чтобы он выглядел так:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...