Python,Selenium用类查找元素并等待类更改

标签 python selenium selenium-webdriver css-selectors webdriverwait

我有一个网页,它可以动态加载内容,而页面加载时却有纺车,我已经找到了解决方案来抓取立即在页面上加载的内容,但似乎找不到解决方案来抓取稍后在dom中加载的内容。

我能想到的是找到具有特定类型旋转轮毂的元素,并等待其更改(一旦更改),这意味着内容已加载到dom中。

我在Selenium上将Firefoxwebdriver Ubuntu一起使用。

这是我要监视的类(class):

<div class="wheel spinning"></div>

加载内容后,车轮停止旋转并将类更改为:
<div class="wheel"></div>

任何人都可以找到解决方案来查找和监视class="wheel spinning",一旦将其更改为class="wheel"即可继续获取数据。

编辑:

XPATH实际上解决了解决方案的一部分,这是代码的一部分
try:
    element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']))
)
title = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[3]')
print(title.text)

但是,如果元素在10秒钟内未出现,则错误消失了,现在可以找到一种方法,可以一次又一次地重试,直到页面上出现该元素为止。
presence_of_element_located((By.XPATH))find_element_by_xpath的使用是否有区别

最佳答案

@LucasTierney的答案是正确的方向。但是我仍然觉得该解决方案可以按以下方式进行优化:

由于是可见的,因此您需要使用 presence_of_element_located() 方法来代替visibility_of_element_located()方法。

节点:

<div class="wheel spinning"></div>

不能通过包含单个类的XPath进行定位,即仅​​ wheel ,如下所示:
el = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']")))

相反,您可以使用Locator Strategies之一:
  • cssSelector:
    el = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.wheel.spinning")))
    WebDriverWait(driver, 10).until(lambda d: 'spinning' not in el.get_attribute('class'))
    
  • xpath:
    el = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='wheel spinning']")))
    WebDriverWait(driver, 10).until(lambda d: 'spinning' not in el.get_attribute('class'))
    
  • 关于Python,Selenium用类查找元素并等待类更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240157/

    相关文章:

    python - Selenium webdriver 在超时后停止

    php - 使用 Selenium Facebook PHP Webdriver 在 chrome 中打开新标签

    selenium - 有没有办法暂停使用 PHPUnit 扩展 Selenium

    java - 从终端执行 java 项目 jar 时出现错误

    javascript - 运行 selenium webdriverjs 测试时如何查看浏览器日志消息

    java - Selenium 3.7 网络驱动程序错误 : Timed out waiting for driver server to start

    python - 如何从 python 中的 steamID 获取 steamid 64

    Python 标准输入文件名

    python - Python 中的 Pygame 没有响应?

    selenium - 如何使用机器人框架和 selenium 读取 Web 控制台输出?