【问题标题】:Selenium code in PyCharm(Python) running slow, how to improve speed?PyCharm(Python)中的Selenium代码运行缓慢,如何提高速度?
【发布时间】:2021-05-22 22:14:06
【问题描述】:

我在 PyCharm 中编写了这个自动化机器人,但我不知道为什么我的代码执行这么慢?我们真诚地感谢您对改进的任何帮助。

from selenium import webdriver
from InfoApp import keys
import time
def order(k):
    driver = webdriver.Chrome(executable_path='driver/chromedriver')
    driver.get(k['product_url'])
    driver.maximize_window()
    driver.find_element_by_xpath('//*[@id="RightRail"]/div/div[4]/fieldset/div/div[7]/label').click()
    driver.execute_script("window.scrollTo(0, 1000)")
    driver.find_element_by_xpath('//*[@id="floating-atc-wrapper"]/div/button').click()
    driver.find_element_by_xpath('//*[@id="PDP"]/div/div[4]/div/div/div/div/div/div/div/div/div/div[3]/div/button[2]').click()
    time.sleep(5)
    driver.find_element_by_xpath('//*[@id="nav-cart"]/a/div/span').click()
    driver.find_element_by_xpath('//*[@id="react-root"]/div/div[4]/button').click()
    driver.find_element_by_xpath('//*[@id="qa-guest-checkout"]').click()
    driver.find_element_by_xpath('//*[@id="firstName"]').send_keys(k["First_Name"])

if __name__ == '__main__':
    order(keys)

【问题讨论】:

  • 它有不必要的time.sleep,可以改成使用webdriver等待。
  • 我添加了 time.sleep 因为页面没有完全加载,我有一行语法可以向下滚动页面并单击,它没有找到按钮,因为页面没有完全加载所以我添加了 time.sleep。所以我应该使用 driver.implicitly_wait(5) 而不是 time.sleep?
  • 自动化中几乎没有使用睡眠

标签: python performance selenium selenium-webdriver pycharm


【解决方案1】:

移除 time.sleep 并添加显式或隐式等待:

你可以添加隐式等待

driver = webdriver.Chrome(executable_path='driver/chromedriver')
driver.implicitly_wait(10)

这将自动使所有命令等待最多 10 秒。如果在 10 秒内未找到元素,则抛出未找到的元素。

但这不会检查 clicability 、 visibility 等,这只会检查元素的存在。对于其他条件,您可以使用显式等待。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(browser, 10)

elem= wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'somelocator')))

注意:

杰夫添加了很好的视频链接,但要添加:

隐式等待不是不好的做法,混合隐式等待和显式等待是不好的做法。由于隐式等待仅等待元素的存在,因此在大多数情况下,您无法避免显式等待,因为您需要等待可见性、可复制性等。所以最好完全避免它,因为当您将隐式和显式等待混合在一起时,它会导致代码中的长时间等待

所以如果你使用显式等待,不要使用隐式等待

【讨论】:

  • 请不要在答案中添加连字符。它添加了一整句大粗体文本。
  • 根据 Selenium 项目负责人 Simon Stewart 等几位 Selenium 贡献者的说法,隐式等待是一种不好的做法。请参阅他的 seleniumconf 演讲:youtu.be/gyfUpOysIF8?t=2200。应该使用显式等待。
  • @JeffC 隐式等待不是不好的做法,混合隐式等待和显式等待是不好的做法。由于隐含等待元素的存在,因此最好完全避免它,因为当您将两者混合在一起时,它会导致代码中的长时间等待。所以你不能避免显式等待,你不应该使用隐式等待
  • 没有。观看视频。 Simon 是编写隐式等待代码的人,他明确表示不要使用它...改用 WebDriverWait。
猜你喜欢
  • 1970-01-01
  • 2023-01-24
  • 2020-06-09
  • 1970-01-01
  • 2021-11-25
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多