Selenium Python无法定位元素

问题描述 投票:1回答:2

我正在尝试从此网页收集每种产品变体的价格信息:https://www.safetysign.com/products/7337/ez-pipe-marker

我正在使用Selenium和FireFox与Python 3和Windows 10。

这是我目前的代码:

driver = webdriver.Firefox()
driver.get('https://www.safetysign.com/products/7337/ez-pipe-marker')
#frame = driver.find_element_by_class_name('product-dual-holder')
# driver.switch_to.frame('skuer5c866ddb91611')
# driver.implicitly_wait(5)
driver.find_element_by_id('skuer5c866ddb91611-size-label-324').click()   
price = driver.find_element_by_class_name("product-pricingnodecontent product-price-content").text.replace('$', '')
products.at[counter, 'safetysign.com Price'] = price
print(price)
print(products['safetysign.com URL'].count()-counter)

所以,我试着从id中选择第一个产品变体开始(我也尝试了类名)。但是,我得到一个无法找到元素错误。正如众多SO帖子中所建议的,我试图改变帧(即使我在html中找不到包含此元素的帧标记)。我尝试使用索引,类名和不同div元素的id切换到不同的帧,我认为这可能是一个框架,但这些都不起作用。我也试过使用等待,但返回相同的错误。

知道我错过了什么或做错了吗?

python selenium selenium-webdriver web-scraping webdriverwait
2个回答
0
投票

他们可能很有活力。选择label类型选择器而不是索引来点击所需的项目,例如您提到的项目为0(列表中的第一个)。此外,添加labels的等待条件。

如果你想限制只有5个size选择,那么使用以下css选择器而不是label

.sku-contents ul:nth-child(3) label

sizes = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".sku-contents ul:nth-child(3) label")))
sizes[0].click()

选择尺寸后,您可以从价格节点中获取价格,具体取决于您是否需要给定样本尺寸的价格,例如0-99。

要获得最终价格:

.product-under-sku-total-label

码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.safetysign.com/products/7337/ez-pipe-marker'
driver = webdriver.Chrome()
driver.get(url)
labels = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "label")))
labels[0].click()
price0to99 = driver.find_element_by_css_selector('.product-pricingnodecontent').text
priceTotal = driver.find_element_by_css_selector('.product-under-sku-total-label').text
print(priceTotal, price0To99)
# driver.quit()

1
投票

要找到你必须为visibility_of_all_elements_located()引入WebDriverWait的元素,你可以创建一个List并将其迭代到click()每个项目,你可以使用以下解决方案:

  • 代码块: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver=webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe') driver.get("https://www.safetysign.com/products/7337/ez-pipe-marker") for product in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//form[@class='product-page-form']//div[@class='sku-contents']//following::ul[1]/li//label[starts-with(@for, 'skuer') and contains(., 'Pipe')]"))): WebDriverWait(driver, 20).until(EC.visibility_of(product)).click() driver.quit()
© www.soinside.com 2019 - 2024. All rights reserved.