首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有什么办法给Selenium找到元素/s的时间限制吗?

有什么办法给Selenium找到元素/s的时间限制吗?
EN

Stack Overflow用户
提问于 2019-04-22 09:13:05
回答 3查看 2.9K关注 0票数 1

我正在尝试使用Python驱动程序自动化Google,我的代码是稳定的,可以得到我需要的东西,,但不是性能时间。

我使用迭代代码通过Google获取商家数据,使用Selenium获取1个商家数据的时间低于1秒,但是当代码发现异常时,需要花费6到7秒的时间。

以下是一些执行时间的摘要:

https://picoolio.net/image/dgxC (正常执行时间)

https://picoolio.net/image/dgxT (在开放时间发生异常时,执行时间太长)

https://picoolio.net/image/dgxV (异常发生时的执行时间,有时按预期运行)

下面是一些开放时间列表的代码:

代码语言:javascript
复制
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在超时时停止查找元素吗?或者这是互联网连接的问题?任何想法都欢迎!

更新:所以我将开放时间代码修改为类似于下面的

代码语言:javascript
复制
try:
              if len(driver.find_elements(By.XPATH, './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]'))>0:
                        openhour = wait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, 
                                       './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))
                        #openhour = driver.find_element_by_xpath('.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')
                        driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
                        openhour.click()
                        #openhourstacked = driver.find_element_by_class_name('section-open-hours-container-hoverable').get_attribute("aria-label")
                        openhourstacked = wait(driver, 5).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]
                    else:
                        openhourlist = []
                        print("No Open Hour list in this merchant! (Not an Exception)")
                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

是的,这样才能真正避免异常,但是这会像以前一样重复搜索,所以当没有找到元素时,它可能会给出长达6-7秒的搜索时间。在这些术语中,显式等待也没有多大帮助,我认为

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-02 08:30:19

我知道这是一个很长的问题,我忘记了更新,但我想,我意识到将隐式等待设置为几秒钟,例如:像这个driver.implicitly_wait(2)这样的2秒将有助于将WebDriver搜索限制在最后几秒钟,超过最后几秒钟,它会抛出异常。

票数 0
EN

Stack Overflow用户

发布于 2019-04-22 10:16:49

摘要:

在您的代码中,尝试增加显式等待的时间。它不会拖慢你的速度,但它会防止那些例外。尝试5秒而不是1秒。试试这个wait(driver,5)

我们使用等待,因为加载DOM需要时间,有时我们需要等待页面/元素加载/隐藏/更改,并且必须根据更改采取行动。

显式等待所做的是等待到给定的时间,以满足预期的条件,并每500毫秒检查一次条件是否满足。这样,在执行下一个任务之前,您将损失最大500毫秒的时间。如果条件没有及时满足,它将抛出一个超时异常。明确的等待并不能解决所有的问题。

您仍然需要检查可能出现的异常,并在发生这种情况时决定如何处理。有些站点的加载速度很慢,或者您的带宽有时很低。那你就没办法加快进程了。

您必须首先分析页面,并确定预期的内容。如果您正在等待一个元素出现,但是它有可能不存在,那么您应该相应地处理异常。

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

代码语言:javascript
复制
driver.find_elements(By.ID, "locator").size()>0
票数 3
EN

Stack Overflow用户

发布于 2019-04-22 09:24:53

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

代码语言:javascript
复制
  for (int second = 0; second < 60; second++) {
  try {} 
  catch (WebDriverException we) 
  {}
  if (second >= 60) {
  //write failure 
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55791972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档