我会尽力使其简短。我正在尝试点击来自网站搜索的产品。基本上有一个匹配的产品列表,我想单击第一个包含在标题中搜索到的产品名称的产品。 我将发布该网站的链接,以便您检查其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创建条件。
答案 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,然后可以使用以下基于xpath的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