使用Selenium和python进行Web抓取-包含文本的xpath

时间:2020-06-24 10:58:02

标签: python selenium xpath css-selectors webdriverwait

我会尽力使其简短。我正在尝试点击来自网站搜索的产品。基本上有一个匹配的产品列表,我想单击第一个包含在标题中搜索到的产品名称的产品。 我将发布该网站的链接,以便您检查其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秒钟过去了,无法找到满足我编写的xPath条件的元素,但是我无法弄清楚如何使其工作。 我试图获取搜索结果一个元素,并检查其结构下方的标题是否包含我搜索的查询字符串。 请给我一些帮助和解释吗?我对Selenium和XPath很陌生...

我还可以链接到可靠的硒文档吗?我遇到一些困难,试图找到一个好的。也许还可以解释一下如何为xPath创建条件。

2 个答案:

答案 0 :(得分:1)

您的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")

答案 1 :(得分:1)

您需要考虑几件事。您的用例是单击第一个搜索结果或单击有关卡标题的项目。如果单击确定的WebElement导致visibility_of_all_elements_located() WebDriverWait 将会太贵


要点击与卡牌名称有关的项目,您必须为element_to_be_clickable()引出WebDriverWait,然后可以使用以下基于Locator Strategies

  • 直接使用文本 CE285A兼容每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,并且可以使用以下Locator Strategies中的任何一个:

  • 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