[英]Web scraping with selenium and python - xpath with contains text
我會盡量讓它很短。 我正在嘗試單擊從網站搜索出來的產品。 基本上有一個匹配產品列表,我想單擊第一個包含我在其標題中搜索的產品名稱的產品。 我將發布該網站的鏈接,以便您檢查其 DOM 結構: https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and在這種情況下,許多包含我的查詢字符串,我只想單擊第一個。
這是我為此編寫的代碼片段:
def click_on_first_matching_product(self):
first_product = WebDriverWait(self.driver, 6).until(
EC.visibility_of_all_elements_located((By.XPATH, f"//a[@class='df-card__main']/div/div[@class=df-card__title] and contains(text(), '{self.product_code}')"))
)[0]
first_product.click()
問題是 6 秒 go by 並且它找不到滿足我寫的 xPath 條件的元素,但我不知道如何使它工作。 我正在嘗試獲取一個元素的搜索結果並檢查其結構中的標題是否包含我搜索的查詢字符串。 請問我可以提供一些幫助和解釋嗎? 我對 selenium 和 XPaths 很陌生...
我還可以提供一個可靠的 selenium 文檔的鏈接嗎? 我很難找到一個好的。 或許還可以解釋如何為 xPaths 創建條件。
您的 xpath 似乎不正確。嘗試按照 xpath 點擊產品。
driver.get("https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and")
def click_on_first_matching_product(product_code):
first_product = WebDriverWait(driver, 6).until(EC.visibility_of_all_elements_located((By.XPATH,"//div[@class='df-card__title' and contains(text(), '{}')]".format(product_code))))[0]
first_product.click()
click_on_first_matching_product("CE285A")
你需要考慮幾件事。 您的用例是單擊第一個搜索結果或單擊與卡片標題相關的項目。 如果單擊一個明確的WebElement導致WebDriverWait for visibility_of_all_elements_located()
將太昂貴。
要單擊與卡片標題相關的項目,您必須為element_to_be_clickable()
誘導WebDriverWait ,您可以使用以下基於xpath的定位器策略:
直接使用文本CE285A Toner Compatibile Per Hp LaserJet P1102 :
driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='CE285A Toner Compatibile Per Hp LaserJet P1102']"))).click()
通過format()
使用文本變量:
driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') text = "CE285A Toner Compatibile Per Hp LaserJet P1102" WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='{}']".format(text)))).click()
通過%s
為文本使用變量:
driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') text = "CE285A Toner Compatibile Per Hp LaserJet P1102" WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='%s']"% str(text)))).click()
要單擊第一個搜索產品,您必須為element_to_be_clickable()
誘導WebDriverWait ,您可以使用以下任一定位器策略:
CSS_SELECTOR
:
driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.df-card>a"))).click()
XPATH
:
driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='df-card']/a"))).click()
注意:您必須添加以下導入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.