【问题标题】:(python) list index out of range - with using selenium click event(python) 列表索引超出范围 - 使用 selenium click 事件
【发布时间】:2020-07-04 22:37:43
【问题描述】:

共有41个类别复选框,12个可见,其余为隐藏,需要点击显示更多才能显示 隐藏的复选框。

这段代码 这样做:: 1-loop >> 2-click on show more if i > 3-click on checkbox

# -*- 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 个复选框,然后单击显示更多,然后仅单击第一个复选框 NO.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

我搜索了很多关于 selution 的内容,我发现 echeckbox 没有加载,但是当用 .text 更改 .click() 时

我得到了所有复选框标签名称,所以它们不会加载

i mage for checkboxes

【问题讨论】:

  • 错误基本上告诉你变量'lst'没有定义。您需要确保在运行此行之前始终为其分配一些东西。为了我们帮助你,你能展示一下整个函数的代码吗?
  • 我添加了所有有问题的代码
  • 我在您的代码中看不到 lst = [item ...] 失败的行。
  • 对不起,我更正了另一个文件中的错误
  • driver.find_elements_by_css_selector('.a-expander-container .a-checkbox label .a-label')[i].click() 这是导致问题的行。似乎是 i;th element element matching with .a-expander-container .a-checkbox 标签 .a-label` CSS 在页面上不存在。这意味着您没有那么多与该 CSS 匹配的元素。

标签: python css selenium web-scraping scrapy


【解决方案1】:

css选择器的主要问题,因为html有三种结构

前 12 个复选框的 1-first 结构

点击后第一个复选框的 2 秒显示更多

显示更多后单击第一个复选框时的第三个,所有结构将更改并包括所有复选框

(我没有使用第三方,因为它会使代码太长,我想缩短代码)

所以试试这段代码,点击复选框后,你需要点击清除,所以我认为这段代码会有用

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      【解决方案3】:

      这是一个简单而实用的脚本。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多