首页 > 解决方案 > 如何在嵌套 for 循环的最终迭代后点击返回按钮?(硒)

问题描述

所以我定义了后退按钮,只是不知道把它放在哪里或如何合并它。我正在尝试检查子类别中所有未选中的框,然后“返回”到类别以完成主要迭代并检查其余框,只是不知道如何在代码中包含后退按钮的位置以及如何.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time

#driver path
PATH = "C:/Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

#access crunchbase ui
driver.get("https://www.crunchbase.com/search/organizations/field/organization.companies/categories/electric-vehicle")
driver.maximize_window()
time.sleep(5)
print(driver.title)

#navigate crunchbase & add parameters
addcolumn = driver.find_element_by_xpath('//button[@class="mat-focus-indicator add-column-button mat-stroked-button mat-button-base mat-primary"]')
addcolumn.click()

# get items only from first list
all_categories = driver.find_elements_by_xpath('(//mat-nav-list)[1]//mat-list-item')
print('len(all_categories):', len(all_categories))

for category in all_categories:
    print('-----')
    
    # select category
    print('Category:', category.text.strip())
    
    # scroll it to make it visible and clickable
    #driver.execute_script("arguments[0].scrollIntoView(true);", category)
    # or
    ActionChains(driver).move_to_element(category).perform()
    
    # click category to display list of columns in this category
    category.click()
    time.sleep(0.5)

    # search columns ONLY in selected category

    # it selects item only if `mat-checkbox` doesn't have class `mat-checkbox-checked`
    # and it click `label` instead of `checkbox` because `label` is not hidden by `popup message`
    columns = driver.find_elements_by_xpath('(//mat-nav-list)[2]//mat-checkbox[not(contains(@class, "mat-checkbox-checked"))]//label')
    print('len(columns):', len(columns))

    for col in columns:
        print('click:', col.text.strip())
        col.click()
    
    # TODO: click subcategory, select checkboxes, click back button 
    subcategories = driver.find_elements_by_xpath('(//mat-nav-list)[2]//mat-list-item[.//icon[@key="icon_caret_right"]]')
    print('len(subcategories):', len(subcategories))
    for sub in subcategories:
        sub.click()
        
        subcolumns = driver.find_elements_by_xpath('(//mat-nav-list)[3]//mat-checkbox[not(contains(@class, "mat-checkbox-checked"))]//label')
        
        for subc in subcolumns:
            subc.click()
            
    backbutton = driver.find_element_by_xpath('//*[@id="mat-dialog-1"]/column-panel/div/dialog-layout/div/mat-dialog-content/div/div/div[1]/button')   
    backbutton.click()  
        
        
driver.find_element_by_xpath('//button[@aria-label="Apply Changes"]').click()

任何帮助表示赞赏!

标签: pythonseleniumfor-loopselenium-webdriverweb-scraping

解决方案


你在错误的时刻使用它。您在每个类别中单击它,但只有在选择子类别时才必须单击它。

我需要不同的ID——dialog-0而不是dialog-1我使用更短的 XPath。

for sub in subcategories:
    sub.click()
    
    subcolumns = driver.find_elements_by_xpath('(//mat-nav-list)[3]//mat-checkbox[not(contains(@class, "mat-checkbox-checked"))]//label')
    
    for subc in subcolumns:
        subc.click()

if subcategories:               
    backbutton = driver.find_element_by_xpath('//*[@id="mat-dialog-0"]//mat-dialog-content//button')   
    backbutton.click() 

推荐阅读