Selenium 显式等待 LinkedIn 旋转圈

Selenium explicit wait for LinkedIn spinning circles

我正在使用 Selenium 及其 Python 绑定到来自 LinkedIn 的 webscrape 进行研究项目。我在网上抓取人们的个人资料。

在 LinkedIn 中,当你加载一个人的个人资料时,该网站会旋转圆圈,直到经验和教育被完全加载。 我希望 Selenium 等到旋转的圆圈消失,以便在 HTML 源代码中获得经验和教育部分。

所以我的问题是:如何编写一个明确等待 LinkedIn 旋转圈的代码?

编辑:一个更精确的问题是:如何获得旋转圆圈的定位器? 没有时间从浏览器开发工具中做到这一点。它们消失得太快了

编辑 2:另一点。一个人可能有也可能没有教育部门。因此,点击或以其他方式检查教育部分是否存在并不是解决方案。教育部分可能不存在,因为没有教育部分(该人没有在 LinkedIn 上放置任何信息,因此不会在 DOM 中放置教育部分)或者因为它尚未加载(有是一个旋转的圆圈)。我想知道是哪一个。如果是第二个原因(有一个旋转的圈),我想等。 (该部分是一个 div 和一个名为 education-section 的 class。这同样适用于体验

这里是针对本题的项目核心。

这些是 class 中的 2 个函数。 self.getBrowser() return 一个 WebDriver 对象。为了清楚和简洁起见,我删掉了不感兴趣的部分,包括 2 个函数内部的代码,所以实际上似乎没有使用的参数是。我希望剩下的变量是不言自明的。

def waitForPresenceCondition(self, by, value, sleep = True, check_for_404 = True):
    try:
        condition = EC.visibility_of_element_located((by, value))
        WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition)
    except TimeoutException:
        logging.critical("Timed out waiting for page element. Fatal. Exiting")
        raise
    except:
        logging.error("Unexpected exception waiting for page element. Exiting")
        raise
    else:
        logging.debug("Element found in URL")

# Scrape an organization
def scrape(self, url):
   self.getBrowser().get(url)
   try:
       self.waitForPresenceCondition(By.CLASS_NAME, "pv-profile-wrapper")
   except Error404:
       logging.info("waitForPresenceCondition raised 404 error. Returning False")
       return False
    #INSERT HERE EXPLICIT WAIT FOR THE SPINNING CIRCLES

您可以像下面这样更新您的代码:

def waitForPresenceCondition(self, by, value, sleep=True, check_for_404=True, visible=True):
    try:
        if visible:
            condition = EC.visibility_of_element_located((by, value))
        else:
            condition = EC.invisibility_of_element_located((by, value))
        WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition)

这应该允许您使用带有 visible=False 参数的 waitForPresenceCondition() 来等待 div 旋转的圆圈消失

纺车有一个 class 名为 artdeco-spinner

我通过在 Chrome DevTools

中插入断点找到了它

遵循 this 指南并在 "Animation" 个事件上插入断点

然后按照@Andersson 的建议,我使用了 Selenium invisibility_of_element_located 函数,它等待 locator 不可见或不再附加到 DOM。我不需要区分这两种情况

def waitForInvisibility(self, by, value):
    condition_str = "(" + str(by) + "," + value + ")"
    url = self.getBrowserURL()
    msg = "Waiting for in-visibility of "
    msg += condition_str
    msg += " in URL='" + url + "'"
    logging.info(msg)
    try:
        condition = EC.invisibility_of_element_located((by, value))
        WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition)
    except TimeoutException:
        logging.critical("Timed out waiting for element invisibility. Exiting")
        raise
    except:
        logging.error("Unexpected exception waiting for element invisibility. Exiting")
        raise
    else:
        logging.debug("Element " + condition_str + " is now invisible in URL='" + url + "'")