![](/img/trans.png)
[英]Selenium xpath - alternative of text() to locate an element using inner text?
[英]Xpath to locate element using text() and @class as conditions
我正在尝试自动将商品添加到在线商店的购物车中,但是,我陷入了一个应该区分商品是否可用的循环中。
这是循环:
while True:
#if ???
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[text()='" + size.get() + "']"))).click()
sleep(1)
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[text()='Add to cart']"))).click()
sleep(1)
print("Success!")
break
else:
driver.refresh()
sleep(3)
如果尺寸可用,则按钮处于活动状态:
<div class="styles__ArticleSizeItemWrapper-sc-dt4c4z-4 eQqdpu">
<button aria-checked="false" role="radio" class="styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs">
<span class="styles__StyledText-sc-cia9rt-0 styles__StyledText-sc-1n1fwgw-2 styles__ArticleSizeItemTitle-sc-1n1fwgw-3 gnSCRf cLhSqA bipwfD">XL</span>
<span class="styles__StyledText-sc-cia9rt-0 ffGzxX">
</span>
</button>
</div>
如果不是,则按钮处于非活动状态:
<div class="styles__ArticleSizeItemWrapper-sc-dt4c4z-4 eQqdpu">
<button disabled="" aria-checked="false" role="radio" class="styles__ArticleSizeButton-sc-1n1fwgw-0 fBeTLI">
<span class="styles__StyledText-sc-cia9rt-0 styles__StyledText-sc-1n1fwgw-2 styles__ArticleSizeItemTitle-sc-1n1fwgw-3 gnSCRf cLhSqA bipwfD">XXL</span>
<span class="styles__StyledText-sc-cia9rt-0 styles__StyledText-sc-1n1fwgw-2 kQJTJc cLhSqA">
</span>
</button>
</div>
问题是:这个循环的条件应该是什么?
我尝试过这样的事情:
if (driver.find_elements(By.XPATH, "//*[contains(@class='styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs') and text()='" + e2.get() + "']")):
编辑:在上面的代码中将“=”替换为“,”如下:
if (driver.find_elements(By.XPATH, "//*[contains(@class='styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs') and text()='" + e2.get() + "']")):
但我不断收到无效的 xpath 表达式错误。
编辑:错误消失了,但浏览器不断刷新 else 语句(未找到元素)。
我相信您的错误在于使用contains
函数,该函数需要两个参数:一个字符串和一个子字符串,尽管您向它传递了一个布尔表达式( @class='styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs'
)。
我希望这只是一个错字,而您实际上是要输入contains(@class, 'styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs')
(注意@class
后面的逗号而不是等号)。
此外,您正在寻找一个button
元素,它有一个子文本节点( text()
指的是一个文本节点),它等于您正在寻找的大小,但该文本节点实际上是一个span
的子节点,它是button
的子项。 您可以将您的大小与该span
的文本值进行比较。
尝试这样的事情:
"//*[contains(@class='styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs') and span='"
+ e2.get()
+ "']"
e3="Some value"
x=f"//button[contains(@class,'styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs') and not(contains(@disabled='')) and ./span[contains(text(),'{e3}')]])]"
print(x)
尝试查找包含该类并具有该跨度的按钮,并检查按钮是否已禁用?
我设法让它使用这种条件工作:
if (driver.find_elements(By.XPATH,
"//*[contains(@class, 'styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs')
and .//*[text()='" + e2.get() + "']]")):
它与原始方法非常相似,但是,在text()
之前添加.//*
就可以了。
如果没有.//*
find_elements
在同一个节点中查找,导致找不到元素。 .//*
指示find_elements
在元素所在的子节点中查找。
重要提示:文本条件包含在额外的[]
括号中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.