(python)使用selenium click事件列出超出范围的索引

2024-05-15 00:06:32 发布

您现在位置:Python中文网/ 问答频道 /正文

共有41个类别复选框,12个可见,其余为隐藏,需要单击“显示更多”以显示 隐藏的复选框

此代码 这样做::1-loop>&燃气轮机;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个复选框中运行良好,然后单击ShowMore,然后只单击第一个复选框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没有加载,但是当change.click()with.text时

我得到所有的复选框标签名称,所以它们如何不加载

i mage for checkboxes


Tags: 代码gt信息bytimecontainerdriverfind
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()

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

第一个12的第一个结构复选框

单击“显示更多”后,第一个复选框显示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

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)

相关问题 更多 >

    热门问题