如何检查嵌套循环(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。
还有其他问题。当我单击 category
或 checkbox
时,有时它会显示 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()
关于如何检查 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。
还有其他问题。当我单击 category
或 checkbox
时,有时它会显示 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()