Selenium Python无法找到元素

时间:2019-03-11 14:59:28

标签: python selenium selenium-webdriver web-scraping webdriverwait

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

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

这是我当前的代码:

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切换到不同的框架,但是这些都不起作用。我也尝试使用等待,但是返回相同的错误。

知道我丢失或做错了什么吗?

2 个答案:

答案 0 :(得分:1)

要找到要为titles = hash.values.map(&:keys).flatten.uniq rows = hash.values.map { |data| data.values_at(*titles) } s = CSV.generate do |csv| csv << titles rows.each do |row| csv << row end end 生成 WebDriverWait 的元素,可以创建一个 List 并将其遍历到visibility_of_all_elements_located()项目,您可以使用以下解决方案:

  • 代码块:

    click()

答案 1 :(得分:0)

它们很可能是动态的。改用label类型选择器选择,然后索引以单击所需的项目,例如您提到的项目为0(列表中的第一项)。另外,添加一个等待条件以使label出现。

如果只想限制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()