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

我正在尝试使用 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 秒的长时间搜索。明确等待在这些术语中也没有真正的帮助思考


繁花不似锦
浏览 324回答 2
2回答

www说

概括:在您的代码中尝试增加显式等待的时间。它不会减慢您的速度,但会阻止这些异常。尝试 5 秒而不是 1 秒。试试这个wait(driver,5)我们使用等待是因为加载 DOM 需要时间,有时我们需要等待页面/元素加载/隐藏/更改,我们必须根据更改采取行动。显式等待的作用是等待给定的时间来满足预期的条件,并每 500 毫秒检查一次条件是否满足。这样,在执行下一个任务之前,您最多会损失 500 毫秒的时间。如果条件没有及时满足,就会抛出超时异常。显式等待并不能解决您的所有问题。您仍然需要检查可能的异常并决定发生这种情况时要做什么。有些网站加载速度很慢,或者您的带宽有时很低。那么你就没有办法加快这个过程了。您必须首先分析页面并确定会发生什么。如果您正在等待某个元素存在但有可能它可能不存在,那么您应该相应地处理异常。如果您正在检查页面中是否存在元素,那么最好不要等待元素,而是尝试使用find_elements_并检查列表的大小。这样你就可以避免异常并且会更快。driver.find_elements(By.ID, "locator").size()>0

绝地无双

是的,显式等待(webdriver wait)解决了这个问题。其他简单的方法是创建一个带有时间秒数的 for 循环并在循环内写入 find 元素,因此即使失败,它也会检查 180 秒并写入超出预期等待时间的条件&nbsp; for (int second = 0; second < 60; second++) {&nbsp; try {}&nbsp;&nbsp; catch (WebDriverException we)&nbsp;&nbsp; {}&nbsp; if (second >= 60) {&nbsp; //write failure&nbsp;&nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python