如何检查嵌套循环(Selenium)中未选中的框?

How to check unchecked boxes in nested loop (Selenium)?

关于如何检查 Selenium 中未选中的框,关于公司子类别。创建了一个嵌套循环并尝试了不同的语法......仍然没有得到它。试图将 xpath 设置为 True.. 也没有用。 运行 代码和 lmk 你的想法!

#imports
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
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()

compcats = driver.find_elements_by_css_selector("mat-list-item")

subcats = driver.find_elements_by_css_selector("checkbox")

uncheck = driver.find_element_by_xpath('//input[@aria-checked="false"]')

for cc in compcats:
    for sc in subcats:
        if uncheck.is_displayed():
            sc.click()  

更新代码:

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

尝试了 continue、break 和 pass 语句,但现在只是不理解 backbutton 代码逻辑,即它去哪里以及如何在检查的子类别的最后一次迭代后仅 运行 它。 .

我看到两个问题。

首先:您尝试在循环之前获取所有复选框,但您应该只获取所有类别,接下来 运行 循环以单击类别,然后搜索当前类别的复选框,对于每个复选框,您应该搜索 checked

其次:此页面显示非标准小部件,因此它不会在 checkbox 中更改 checked,但在某些非标准小部件中设置 class。

还有其他问题。当我单击 categorycheckbox 时,有时它会显示 popup message 隐藏其他 checkbox 并且代码无法检查它。我单击 label 也检查 checkbox 但它不显示 popup message

在两个类别中有子类别,它仍然需要代码来单击子类别,获取复选框并选中它们。接下来它必须单击按钮返回类别。


有很多 //mat-nav-list - 一个有类别,一个有列和子类别,一个有子类别中的列 - 所以我必须使用索引来处理正确的列表 - 并且 xpath 在 [=22 处开始索引=] - (//mat-nav-list)[1], (//mat-nav-list)[2]。它还需要 ( ) 到 select 正确列表,因为 //mat-nav-list[1](//mat-nav-list)[1] 表示不同的对象。


最小工作代码:

#imports
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

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

#access crunchbase ui
driver.maximize_window()  # it is more natural (for human) to resize window before opening page - and some servers may check window size to detect script.
driver.get("https://www.crunchbase.com/search/organizations/field/organization.companies/categories/electric-vehicle")
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))

driver.find_element_by_xpath('//button[@aria-label="Apply Changes"]').click()