有什么方法可以限制硒的发现时间吗?

时间:2019-04-22 09:13:05

标签: python selenium selenium-chromedriver

我正在尝试使用Python Selenium Chrome驱动程序自动执行Google Maps,我的代码很稳定,可以满足我的需要,但是不是性能时间。

我使用迭代代码通过Google Maps获取商家数据,使用Selenium获取1个商家数据的时间率低于1秒,但是当代码捕获异常时,将花费非常长的时间,例如6-7秒。 / p>

以下是执行时间的摘要:

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

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

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在发生超时的情况下停止查找元素?还是这是互联网连接问题?欢迎有任何想法!

更新: 因此,我将开放时间代码修改为类似的

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

是的,这样可以真正避免Exception,但是像以前一样重复搜索,因此当找不到元素时,它可能会再次进行长达6到7秒的长时间搜索。我认为这些术语

3 个答案:

答案 0 :(得分:3)

摘要:

  

在您的代码中,尝试增加显式等待的时间。不会的   让您放慢脚步,但可以防止出现这些异常情况。尝试5秒而不是1秒。试试这个wait(driver,5)


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

您仍然需要检查可能的异常,并确定在发生异常时该怎么办。有些网站加载速度慢,或者您的带宽有时很低。这样您就无法加快该过程。

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

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

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

答案 1 :(得分:0)

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

NaN

答案 2 :(得分:0)

我知道这已经是一个很长的问题,需要解决的办法,忘了再次更新,但我认为,我意识到将隐式等待时间设置为几秒钟,例如:2秒driver.implicitly_wait(2)这样有助于限制WebDriver搜索到最后几秒钟(比最后几秒钟多),它将引发异常