Как нажимать кнопки от А до Я, используя Selenium и Python на веб-странице http://architects -register.org.uk / list / region - PullRequest
0 голосов
/ 30 октября 2019

http://architects -register.org.uk / list / region

Итак, у меня есть этот веб-сайт, на котором я хочу получить код, нажмите кнопку A, затем Bи с и тд. Как я должен это сделать. Я попробовал этот код, который пытается получить значение дочернего элемента, а затем нажать кнопки соответственно, но это не работает. Я подозреваю, что есть некоторые другие проблемы, кроме ошибки ниже.

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()

url = 'http://architects-register.org.uk/'
driver.get(url)

find_uk = driver.find_element_by_id('ctl00_hlCountiesT').click()

elements = alphabets[0].find_element_by_tag_name('li')

def getChild(el):
   return el.children[0].children[0]

for element in elements:
    element = element[elements]
    (getChild(element)).click()

NameError: name 'alphabets' is not defined

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Индуцируйте WebDriverWait и visibility_of_all_elements_located () и затем нажимайте на каждую ссылку.

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.Firefox()
url = 'http://architects-register.org.uk/'
driver.get(url)
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"ctl00_hlCountiesT"))).click()
elements =WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.XPATH,"//div[@class='alphabet_list_content']//li//input")))
for ele in range(len(elements)):
    elements = WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='alphabet_list_content']//li//input")))
    elements[ele].click()
1 голос
/ 30 октября 2019

alphabets не импортируется и не определяется нигде в данном блоке кода, поэтому попытка получить доступ к индексу по нему не удастся описанным способом. Похоже, что alphabets, вероятно, должно быть результатом вызова find_elements_by_tag_name или find_elements_by_class_name, который вернет список ваших кнопок, которые вы затем можете перебрать и нажать.

0 голосов
/ 31 октября 2019

Чтобы нажать на кнопку A , затем B и C и т. Д., Вы должны вызвать WebDriverWait для element_to_be_clickable() и вы можете использовать любую из следующих Стратегий локатора :

  • Использование CSS_SELECTOR:

    driver.get("http://architects-register.org.uk/list/regions")
    for i in range(1, len(WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.alphabet_list_content>ul li"))))):
        WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.alphabet_list_content>ul li:nth-of-type({})>a>input".format(i)))).click()
    driver.quit()   
    
  • Использование XPATH:

    driver.get("http://architects-register.org.uk/list/regions")
    for i in range(1, len(WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='alphabet_list_content']/ul//li"))))):
        WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='alphabet_list_content']/ul//following-sibling::li[{}]/a/input".format(i)))).click()
    driver.quit()   
    
  • Примечание : необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
...