簡體   English   中英

Xpath 使用 text() 和 @class 作為條件定位元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM