我试图在网上store 中自动将商品添加到购物车,然而,我陷入了一个应该区分商品是否可用的循环中.

以下是循环:

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>

The question is: what should be the condition for this loop?

我试过这样的方法:

if (driver.find_elements(By.XPATH, "//*[contains(@class='styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs') and text()='" + e2.get() + "']")):

EDIT:将上述代码中的"="替换为",",如下所示:

if (driver.find_elements(By.XPATH, "//*[contains(@class='styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs') and text()='" + e2.get() + "']")):

但我一直得到无效的xpath表达式错误.

EDIT:错误消失,但浏览器会使用else语句(未找到元素)不断刷新.

推荐答案

我设法使用以下条件使其工作:

if (driver.find_elements(By.XPATH,
 "//*[contains(@class, 'styles__ArticleSizeButton-sc-1n1fwgw-0 jIVZOs')
 and .//*[text()='" + e2.get() + "']]")): 

这与最初的方法非常相似,但是,在text()之前加.//*就成功了.

如果没有.//*find_elements正在查找同一个 node ,导致找不到元素..//*指示find_elements查找元素存在的子 node .

重要提示:文本条件用额外的[]个括号括起来.

Python相关问答推荐

获取Azure Pipelines以从pyproject.toml(而不是relevments_dev.文本)安装测试环境

"如果发生特定错误,返回值

如何将我的位置与光强度数据匹配到折射图案曲线中?

如何在msgraph.GraphServiceClient上进行身份验证?

Polars LazyFrame在收集后未返回指定的模式顺序

_repr_html_实现自定义__getattr_时未显示

如何找到满足各组口罩条件的第一行?

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如何从pandas的rame类继承并使用filepath实例化

我如何根据前一个连续数字改变一串数字?

Odoo 16使用NTFS使字段只读

driver. find_element无法通过class_name找到元素'""

多指标不同顺序串联大Pandas 模型

Python全局变量递归得到不同的结果

人口全部乱序 - Python—Matplotlib—映射

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Pandas:填充行并删除重复项,但保留不同的值

pandas fill和bfill基于另一列中的条件

如何在信号的FFT中获得正确的频率幅值