selenium 在python代码中艰难地定位要用Selify单击的元素最初是可行的,但却意外地停止了

bqucvtff  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(106)

我使用 selenium 从一个基于Shopify的网站收集几个项目的总价格(包括税收和运费)的差异。到目前为止,我已经成功地将商品添加到购物车中。这需要将所选商品添加到购物车中,然后转到结账页面,更新城市、邮政编码和州,最后在Finalize页面结束以获取总额。
最初,我的代码运行得很好,足以让我转到结账页面,但无法找到发送所需密钥的元素。在努力解决这个问题时,情况发生了变化,突然停止了对结账按钮的定位。
从我的调查来看,问题可能是需要切换框架--事实上,当你点击购物车按钮时,会弹出一个侧栏,上面有需要结账的按钮。我一直在期待html,但在Frame标签中找不到这些东西。我还一直在使用time.sleep()来允许加载东西的时间,以及滚动让东西进入视线,但仍然没有运气。
以下是您选择购物车后网站的外观示例:

你可以看到有一个弹出窗口挡住了
下面是我的代码:

url = 'https://americanbarbell.com/products/american-barbell-cast-kettlebell'
    index_list = [('4KG',1),('12KG,4)]
    smallerlist = ['4KG', '12KG']
    path = "C:\Program Files (x86)\msedgedriver.exe"
    driver = webdriver.Edge(path)
    driver.get(url)
    time.sleep(1)

    driver.refresh()  ###I have this here because a pop up comes up when the webdriver opens the page, and this was a workaround to actually close it

    time.sleep(1)

    driver.execute_script("window.scrollTo(0, 550)") 

    for item in smallerlist:
        for tup in index_list:
            if item == tup[0]:
                n = tup[-1]

        time.sleep(2)

        driver.find_element(By.XPATH, '//*[@id="product_form_377205240"]/div[2]/div/div/div').click()
        time.sleep(2)

        driver.find_element(By.XPATH, f'//*[@id=\"377205240-weight\"]/li[{n}]/div').click()

        time.sleep(1)

        add_cart = driver.find_element(By.XPATH, '//*[@id="product_form_377205240"]/div[3]/button')
        driver.execute_script("arguments[0].click();", add_cart)

        time.sleep(3)

        driver.refresh()

        checkout = driver.find_element(By.XPATH,'/html/body/div[2]/div[5]/div[3]/div/form/div[2]/div[2]/div[3]/div[2]').click()

我得到的错误是:

Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[2]/div[5]/div[3]/div/form/div[2]/div[2]/div[3]/div[2]"}

我还尝试了XPath:

/html/body/div[3]/div[5]/div[3]/div/form/div[2]/div[2]/div[3]/div[2]/button

返回相同的错误
我也尝试过使用弹出窗口的x路径来关闭它,Selify也没有找到该元素。
令人沮丧的是,代码工作得很好,然后突然停了下来。我猜我的代码一开始就很脆弱,我只是幸运而已。我被困在寻找解决方案的时间太长了。我在想,也许它在我需要切换到的框架内?我还需要等更长时间吗?元素是否被弹出窗口隐藏?

dldeef67

dldeef671#

看起来元素的位置并不稳定。您需要更精确地搜索元素。
checkout = driver.find_element(By.XPATH,'/html/body/div[2]/div[5]/div[3]/div/form/div[2]/div[2]/div[3]/div[2]').click()替换为checkout = driver.find_element(By.XPATH, '//button[@name="checkout"]').click()
它在Chrome上适用,希望它在Edge上也能用

相关问题