![](/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.