(python) индекс списка вне диапазона - с использованием события щелчка селена - PullRequest
3 голосов
/ 24 марта 2020

Имеется 41 флажок категории, 12 видны и остаются скрытыми, необходимо нажать на кнопку показать больше, чтобы показать скрытые флажки.

этот код делает это: 1-l oop >> 2- нажмите на кнопку Показать больше, если я <= 12 >> 3-раз щелкните по флажку

# -*- coding: utf-8 -*-
import time
from selenium import webdriver

driver = webdriver.Chrome(executable_path='C:\\Users\\Compu City\\Desktop\\chromedriver.exe')
driver.get('https://www.amazon.com/international-sales-offers/b/?ie=UTF8&node=15529609011&ref_=nav_navm_intl_deal_btn')
time.sleep(10)
res = driver.execute_script("return document.documentElement.outerHTML")

i=0
while i <= 41 :
    if(i <=12):
        driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > a > span').click()
    driver.find_elements_by_css_selector('.a-expander-container .a-checkbox label .a-label')[i].click()
    driver.implicitly_wait(2)
    time.sleep(2)
    i+=1

проблема: код хорошо работает с 12 флажками и затем нажмите показать больше, затем нажмите только на первый флажок № 13 затем получаю эту ошибку

D:\python neww>aaa.py

DevTools listening on ws://127.0.0.1:59799/devtools/browser/ac2188e0-10e3-493b-9d91-614731f8d135
Traceback (most recent call last):
  File "D:\python neww\aaa.py", line 14, in <module>
    driver.find_elements_by_css_selector('.a-expander-container .a-checkbox label .a-label')[i].click()
IndexError: list index out of range

Я много искал о разрешении, что я обнаружил, что echeckbox не загружается, но при изменении .click () на .text

я получаю все имена меток флажков, так как они не загружаются

я мага для флажков

Ответы [ 3 ]

1 голос
/ 25 марта 2020

проблема с css селекторами попробуйте этот код


i = 5
while i <= 29:
    driver.implicitly_wait(3)
    time.sleep(3)
    if(i==5):
        cat =driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > div > span:nth-child({}) > div > label'.format(i)).click()
        driver.implicitly_wait(3)
        time.sleep(3)
    else:
        y=11
        while y<=29:
            cat = driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > span:nth-child({}) > div > label'.format(y)).click()
            y+=1
            driver.implicitly_wait(3)
            time.sleep(3)
    driver.implicitly_wait(3)
    time.sleep(3)

    i += 1
    print('i: ', i)
1 голос
/ 25 марта 2020

основная проблема с селекторами css, потому что есть три структуры для html

1-первая структура для первых 12 флажков

2-секундная для первого флажка после щелчка показать далее

3-ий при нажатии на первый флажок после показа больше все структура изменится и будет включать в себя весь флажок

(я не использовал третью часть, потому что это сделает код так долго и я хочу сократить код)

, поэтому попробуйте этот код, после того, как вы установите флажок, вам нужно будет нажать кнопку Очистить, поэтому я думаю, что этот код будет полезен

first_part = 12
while first_part <=12:
    #click on category checkbox
    driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > span:nth-child({}) > div > label'.format(first_part)).click()
    driver.implicitly_wait(3)
    time.sleep(3)
    #clear filter
    driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > span > div > a').click()
    driver.implicitly_wait(3)
    time.sleep(3)
    #print text of checkbox category
    print(driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > span:nth-child({}) > div > label'.format(first_part)).text)
    first_part+=1
second_part = 1
while second_part <= 26:
    #show more
    driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > a > span').click()
    driver.implicitly_wait(2)
    time.sleep(2)
    #print text of checkbox category
    print(driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > div > span:nth-child({}) > div > label'.format(second_part)).text)
    #click on category checkbox
    driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > div > span:nth-child({}) > div > label'.format(second_part)).click()
    driver.implicitly_wait(3)
    time.sleep(3)
    #clear filter
    driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > span > div > a').click()
    driver.implicitly_wait(3)
    time.sleep(3)
    second_part+=1
0 голосов
/ 24 марта 2020

Вот простой и приятный скрипт, который будет работать.

driver.get('https://www.amazon.com/international-sales-offers/b/?ie=UTF8&node=15529609011&ref_=nav_navm_intl_deal_btn')
checkCSS = "[class='a-row a-spacing-small filterItem']:nth-of-type(1) .a-checkbox.checkbox.a-spacing-micro"
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, checkCSS)))
departments = len(driver.find_elements_by_css_selector(checkCSS))

for depNum in range(departments):
    print(depNum)
    if depNum == 12:
        WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, "span.a-expander-prompt"))).click()
        time.sleep(1)
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, checkCSS)))
    driver.find_elements_by_css_selector(checkCSS)[depNum].click()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...