为了账号安全,请及时绑定邮箱和手机立即绑定

有什么方法可以限制 Selenium 查找元素的时间吗?

有什么方法可以限制 Selenium 查找元素的时间吗?

繁花不似锦 2022-01-18 16:06:54
我正在尝试使用 Python Selenium Chrome 驱动程序自动化谷歌地图,我的代码很稳定,可以得到我需要的东西,但不是性能时间。我使用迭代代码通过 Google Maps 获取商家数据,使用 Selenium 获取 1 个商家数据的时间速率低于 1 秒,但是当代码捕获异常时,需要很长时间,例如 6-7 秒。以下是执行时间的一些摘要:https://picoolio.net/image/dgxC(正常执行时间)https://picoolio.net/image/dgxT(Open Hour发生异常时的执行时间,太长了)https://picoolio.net/image/dgxV(发生异常时的执行时间,有时按预期运行)这是一些获取开放时间列表的代码:try:      openhour = wait(driver, 1).until(EC.visibility_of_element_located((By.XPATH,                            './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))      driver.execute_script("arguments[0].scrollIntoView(true);", openhour)      openhour.click()      openhourstacked = wait(driver, 1).until(EC.visibility_of_element_located((By.CLASS_NAME,                                   'section-open-hours-container-hoverable'))).get_attribute("aria-label")      openhourlist = openhourstacked.split(",")      openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")      openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]      except NoSuchElementException:         openhourlist = []         print("No Open Hour list in this merchant!")         openhour_trig = True      except WebDriverException:         openhourlist = []         print("Failed to load Open Hour list in this merchant!")         openhour_trig = True很多建议说要正确地进行显式等待,我应该使用 WebDriverWait 和 EC(预期条件)的组合,我直接使用上面的代码进行了尝试,但是 WebDriverWait 似乎不适用于所有传入的异常,换句话说,有时成功,有时失败。我试图用 替换EC.visibility_of_all_element_located,EC.presence_of_all_element_located但它没有任何区别。我希望在发生任何异常时使执行时间仍然顺畅,除了上述方式之外,还有什么方法可以让 Selenium 在超时的情况下停止查找元素?或者这是一个互联网连接问题?欢迎任何想法!是的,这样它确实避免了异常,但这会像以前一样重复搜索,因此当找不到元素时,它可能会再次进行长达 6-7 秒的长时间搜索。明确等待在这些术语中也没有真正的帮助思考
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

概括:

在您的代码中尝试增加显式等待的时间。它不会减慢您的速度,但会阻止这些异常。尝试 5 秒而不是 1 秒。试试这个wait(driver,5)


我们使用等待是因为加载 DOM 需要时间,有时我们需要等待页面/元素加载/隐藏/更改,我们必须根据更改采取行动。
显式等待的作用是等待给定的时间来满足预期的条件,并每 500 毫秒检查一次条件是否满足。这样,在执行下一个任务之前,您最多会损失 500 毫秒的时间。如果条件没有及时满足,就会抛出超时异常。显式等待并不能解决您的所有问题。

您仍然需要检查可能的异常并决定发生这种情况时要做什么。有些网站加载速度很慢,或者您的带宽有时很低。那么你就没有办法加快这个过程了。

您必须首先分析页面并确定会发生什么。如果您正在等待某个元素存在但有可能它可能不存在,那么您应该相应地处理异常。

如果您正在检查页面中是否存在元素,那么最好不要等待元素,而是尝试使用find_elements_并检查列表的大小。这样你就可以避免异常并且会更快。

driver.find_elements(By.ID, "locator").size()>0


查看完整回答
反对 回复 2022-01-18
?
绝地无双

TA贡献1946条经验 获得超4个赞

是的,显式等待(webdriver wait)解决了这个问题。其他简单的方法是创建一个带有时间秒数的 for 循环并在循环内写入 find 元素,因此即使失败,它也会检查 180 秒并写入超出预期等待时间的条件


  for (int second = 0; second < 60; second++) {

  try {} 

  catch (WebDriverException we) 

  {}

  if (second >= 60) {

  //write failure 

  }


查看完整回答
反对 回复 2022-01-18
  • 2 回答
  • 0 关注
  • 323 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信