【问题标题】:Python & Selenium: How to wait until is text is present to continue?Python & Selenium:如何等到出现文本才能继续?
【发布时间】:2020-02-12 18:08:58
【问题描述】:

我正试图在我的经纪人网站中自动提取股票价格,因为雅虎和谷歌金融有延迟。但我需要代码等待“家庭经纪人”上线,这样它才能继续抓取...

这是我的代码:

expected = 'online'
while True:
    try:
       driver.find_element_by_xpath('//*[@id="spnStatusConexao"]').text == expected
    except NoSuchElementException:
        print('offline')
    else:
    print('online')

但是,在对其进行测试时,即使 homebroker 显示“离线”消息,它也会打印“在线”。

当 xpath 文本等于:offline 时,我需要打印 'offline' 。并在 xpath 文本等于:在线时打印“在线”。

编辑:

外部 HTML:

<span id="spnStatusConexao" hover="DV_bgConexao" class="StatusConexao online">online</span>

XPath:

//*[@id="spnStatusConexao"]

完整的 XPath:

/html/body/form/div[9]/div/div/p[2]/span

【问题讨论】:

    标签: python-3.x selenium xpath web-scraping


    【解决方案1】:

    Python 中的expected_conditions 有一个内置操作,称为text_to_be_present_in_element。下面的代码 sn-p 将等待 span 元素包含文本 online

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.ID, "spnStatusConexao"), 'online'))
    

    如果这不起作用,您可以尝试在 presence_of_element_located 上调用 WebDriverWait 并将 text 包含在您的 XPath 查询中:

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//span[@id='spnStatusConexao' and contains(text(),'online')]")))
    

    【讨论】:

    • 我无法预测页面加载的时间。当页面加载时,它以离线消息开始,一段时间后变为在线。当离线更改为在线时,这将使我的代码继续进行,或者在页面加载时只是期待在线消息?对不起,如果我感到困惑......
    • 得到:selenium.common.exceptions.TimeoutException:消息:
    • 如果页面以“离线”消息开头,您希望等到文本显示“在线”。在这里应用WebDriverWait 将等到//*[@id='spnStatusConexao'] 所在的元素显示“在线”文本——它只会等待它需要的时间。在这个WebDriverWait 完成后,您可以继续抓取页面。如果您看到TimeoutException,则可能是“在线”文本未在 10 秒内出现,或者元素定位器不正确。您可以尝试将WebDriverWait(driver, 10) 更改为WebDriverWait(driver, 60) 看看是否有帮助。
    • @GuilhermeAlmeidaC.Machado 在我看来,WebDriverWait 没有正确检测到“在线”文本,很可能是由于定位器无效。我用第二个选项更新了我的答案,其中contains(text(), 'online)' 包含在可能有效的 XPath 查询中。但是,如果这不起作用,那么页面上还有其他东西干扰了定位器 - DOM 中可能有一个更高的 iframe 元素,在与页面交互之前需要切换到该元素。跨度>
    • 成功了!非常感谢克里斯汀。我在您发送的新行之后添加了print(driver.find_element_by_xpath("//*[@id='spnStatusConexao']").text),系统一上线就在线打印。现在我将继续进行其余的报废!
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多