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 + "'")
我正在使用 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 + "'")