問題是關于 selenium webdriver 的顯式等待功能,它與超時的定位操作相同。Webdriver 等待元素可見或存在。在我的情況下,我定位具有顯式等待和沒有它的元素。當它沒有顯式等待時,它會找到并分配它。但在下面,我也嘗試找到顯式等待的元素,該變數未分配,并以這種形式傳遞給 for 迭代,我的 for 迭代讓UnboundLocalError
我知道錯誤不是 selenium 而是基于 python 的。我可以通過使用而不是passy_priceNewProds = x_priceNewProds` 來消除該錯誤,但我需要了解為什么 selenium webdriver 無法通過等待找到元素,如果它已經在上面的一行找到了它。也必須有餅干。
代碼如下;
import pandas as pd
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#reading from csv file url-s
def readCSV(path_csv):
df=pd.read_csv(path_csv)
return df
fileCSV=readCSV(r'C:\Users\Admin\Downloads\urls.csv')
length_of_column_urls=fileCSV['linkamazon'].last_valid_index()
def create_driver():
chrome_options = Options()
chrome_options.headless = True
chrome_options.add_argument("start-maximized")
# options.add_experimental_option("detach", True)
chrome_options.add_argument("--no-sandbox")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
webdriver_service = Service(r'C:\pythonPro\w_crawl\AmznScrpBot\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=chrome_options)
return driver
#going to urls 1-by-1
def goToUrl_Se(driver):
global counter
counter = 0
for i in range(0, length_of_column_urls 1):
xUrl = fileCSV.iloc[i, 1]
print(xUrl,i)
# going to url(amazn) via Selenium WebDriver
driver.get(xUrl)
parse_data()
counter =1
driver.quit()
#fetch-parse the data from url page
def parse_data():
global asin, title, bookform, priceNewProd
wait=WebDriverWait(driver,timeout=20)
try:
#trying code snippets where locating elements occur by XPATH, in some ofthem
#there is also WebDriver explicit wait, that element has both methods
#with presence_of element wait method and without explicit wait method. Just trying to understand
#why sometimes elements cannot be located on page
y_data_index=wait.until(EC.presence_of_element_located((By.XPATH,"//div[@data-index='1']")))
print(y_data_index.text,'y_index')
x_data_index=wait.until(EC.visibility_of_element_located((By.XPATH,"//div[@data-index='1']")))
print(x_data_index.text,'x_index')
x_titles=driver.find_elements(By.XPATH,'//span[contains(@class,"a-size-medium")]')
x_bookforms = driver.find_elements(By.XPATH,'//div[contains(@class,"a-section a-spacing-none a-spacing-top-micro s-price-instructions-style")]//div[contains(@class,"a-row a-size-base a-color-base")]//a[contains(@class,"a-size-base a-link-normal puis-medium-weight-text s-underline-text s-underline-link-text s-link-style s-link-centralized-style a-text-bold")]')
x_priceNewProds = driver.find_elements(By.XPATH,'//div[contains(@class,"a-row a-size-base a-color-base")]//span[contains(@data-a-color,"base")]//span[contains(@class,"a-offscreen")][1]')
y_priceNewProds=wait.until(EC.visibility_of_all_elements_located((By.XPATH,'//div[contains(@class,"a-row a-size-base a-color-base")]//span[contains(@data-a-color,"base")]//span[contains(@class,"a-offscreen")][1]')))
except:
pass
for i in range(len(x_titles)):
x_title=x_titles[i].text
x_priceNewProd = x_priceNewProds[i].text
print(x_priceNewProd)
y_priceNewProd=y_priceNewProds[i].text
print(y_priceNewProd)
try:
x_bookform=x_bookforms[i].text
print(x_bookform)
except:
x_bookform='-'
title = x_title
bookform = x_bookform
priceNewProd = x_priceNewProd
write_to_csv()
def write_to_csv():
if counter==0:
df=pd.DataFrame({'Products':title,'Bookform':bookform,'Price':priceNewProd},index=[0])
wr=df.to_csv('results_new00.csv',index=False,mode='w')
else:
df=pd.DataFrame({'Products':title,'Bookform':bookform,'Price':priceNewProd},index=[0])
wr=df.to_csv('results_new00.csv',index=False,mode='a',header=False)
driver=create_driver()
goToUrl_Se(driver)
y_priceNewProd=y_priceNewProds[i].text UnboundLocalError: local variable 'y_priceNewProds' referenced before assignment
uj5u.com熱心網友回復:
由于您沒有共享包括鏈接在內的所有代碼,我們無法知道那里到底發生了什么,但我猜這一行
wait.until(EC.visibility_of_all_elements_located((By.XPATH,'//div[contains(@class,"a-row a-size-base a-color-base")]//span[contains(@data-a-color,"base")]//span[contains(@class,"a-offscreen")][1]')))
拋出例外,因為該元素是 / 不可見。
這就是為什么y_priceNewProds仍然沒有分配任何值。
如果您使用簡單的driver.find_elements方法,它可以找到這些元素,因為它們存在但同樣不可見。
UPD
在您分享鏈接后,我對其進行了測驗,現在我可以說:是的,我是對的!
這些元素是不可見的。
以下代碼拋出TimeoutException
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("start-maximized")
webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=options)
url = 'https://www.amazon.com/s?i=stripbooks&bbn=1&rh=n:1,p_n_feature_eighteen_browse-bin:8622846011&dc&fs=true&ds=v1:gAO0+Zc+C6RthRkqyWzOHmDVufv7JbuCK96Grvjle68&qid=1665559431&rnid=8622845011&ref=sr_nr_p_n_feature_eighteen_browse-bin_5'
driver.get(url)
wait = WebDriverWait(driver, 20)
m_list = wait.until(EC.visibility_of_all_elements_located((By.XPATH, '//div[contains(@class,"a-row a-size-base a-color-base")]//span[contains(@data-a-color,"base")]//span[contains(@class,"a-offscreen")][1]')))
print(m_list)
UPD2
但是,如果您將采用該元素的直接父元素,它將正常作業,因為它是可見的。
對于以下代碼:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("start-maximized")
webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=options)
url = 'https://www.amazon.com/s?i=stripbooks&bbn=1&rh=n:1,p_n_feature_eighteen_browse-bin:8622846011&dc&fs=true&ds=v1:gAO0+Zc+C6RthRkqyWzOHmDVufv7JbuCK96Grvjle68&qid=1665559431&rnid=8622845011&ref=sr_nr_p_n_feature_eighteen_browse-bin_5'
driver.get(url)
wait = WebDriverWait(driver, 20)
m_list = wait.until(EC.visibility_of_all_elements_located((By.XPATH, '//div[contains(@class,"a-row a-size-base a-color-base")]//span[contains(@data-a-color,"base")]')))
print(len(m_list))
輸出是:
27
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/523526.html
