我使用 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也没有找到该元素。
令人沮丧的是,代码工作得很好,然后突然停了下来。我猜我的代码一开始就很脆弱,我只是幸运而已。我被困在寻找解决方案的时间太长了。我在想,也许它在我需要切换到的框架内?我还需要等更长时间吗?元素是否被弹出窗口隐藏?
1条答案
按热度按时间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上也能用