2017-07-07 39 views
0

我使用Selenium及其Python绑定来自LinkedIn的Webscrape进行研究项目。我webscrape人的配置文件。Selenium显式等待LinkedIn旋转圈

在LinkedIn中,当您加载个人资料时,该网站会放置旋转圈,直到完成加载体验和教育。 我希望Selenium等到旋转的圈子消失,才能在HTML源代码中获得体验和教育部分。

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

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

编辑2:另一点。一个人可能有也可能没有教育部分。因此,单击或以其他方式检查教育部门是否存在不是解决方案。教育部分可能不存在,因为没有教育部分(该人没有在LinkedIn上提供任何信息,因此没有在DOM中插入教育部分),或者因为它尚未加载(有一个旋转圈)。我想知道它是哪一个。如果这是第二个原因(有一个旋转的圈子),我想等待。 (该部分是一个名为education-sectiondiv)。这同样适用于这个问题

这是用于这个问题的项目的核心。

这些是一个类中的2个函数。 self.getBrowser()返回一个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 

回答

2

纺车有类名为artdeco-spinner

我发现它通过插入一个断点在Chrome DevTools

关注this引导并插入的“动画”事件

然后断点通过@Andersson的建议我用硒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 + "'") 
1

你可以像下面代码更新:

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) 

这应该允许您使用waitForPresenceCondition()visible=False参数等到div纺纱圈dissapear

+0

问题是:如何获得旋转圆圈的定位器?浏览器删除工具没有时间做到这一点。它们消失得太快 – raffamaiden

+0

你可以尝试在''div'覆盖的元素上做一个'click()',并且你应该得到像'org.openqa.selenium.WebDriverException:元素不可点击的点( 411,675)。其他元素会收到点击:这里是目标div的HTML。你可以使用异常中的HTML样本做出选择 – Andersson

+0

你可以更具体吗?加载配置文件时,您会看到旋转的圆圈。过了一段时间后,这些旋转的圈子会自行消失(所以可能都是通过AJAX处理的)。 “经过一段时间后”变化很大,但仅仅从开发工具中选择旋转圆圈并查看它们是否具有某些专有类或ID我不能用作选择器 – raffamaiden