我正在使用Selenium创建一个网站购物者来测试我的python技能。除了页面加载时间中的一些无法解决的不一致之处,我已经设法使大部分工作正常进行,但是我想我知道为什么会发生这种情况。
当我在商店中加载商品页面时,我使用以下代码:
try:
cartbttn = driver.find_element_by_name('commit')
if cartbttn.is_displayed():
driver.execute_script("document.getElementsByName('commit')[0].click()")
print("Added to cart")
except(StaleElementReferenceException):
return(115)
代码通常可以正常运行,脚本平均在2.5秒内即可完成运行。 问题是,偶尔按下“添加购物车”按钮或“签出”按钮会使页面滞后,并导致页面“暂停”几秒钟,就好像它正在处理,然后完成操作一样。我知道这并不是他们的等待时间,因为站点并不繁忙,当我手动按下按钮时,永远不会有问题。
我相信应该发生的情况是,当按钮完全“可见”且可单击时,将执行按钮按下javascript,但有时在此之前调用按钮按下,这会导致站点出现故障并需要此赶上时间。 / p>
我尝试过等待该元素可见并使用element.click()函数,该函数无效。我以为使用JavaScript来调用按钮就可以了,但这都不可行。
我还添加了手动睡眠,这有所帮助。睡眠的唯一问题是,对于最坏的情况,睡眠必须足够大,这意味着您将失去站点运行速度更快的速度优势。
预期的结果是按下按钮,并等待直到出现“签出”按钮,然后再尝试按下签出按钮,这样站点才不会出现问题。
答案 0 :(得分:0)
要在元素上调用click()
而不是使用is_displayed()
或等待元素可见,您需要诱使 WebDriverWait 以使所需的元素可点击,您可以使用以下解决方案:
try:
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.NAME, "commit"))).click()
print("Added to cart")
except(TimeoutException):
return("Error while adding to cart")
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC