python - Selenium : Better method to check for AJAX changes other than an infinite loop

标签 python ajax selenium selenium-webdriver

我使用以下代码来检查 Facebook Messages 上是否有新消息:

def waitForNextMessage():
    messageList=driver.find_elements_by_css_selector('.null')
    message=''
    while True:
        driver.implicitly_wait(10)
        element = driver.find_elements_by_css_selector('.null')
        if not(element == messageList):
            message=element[-1].find_elements_by_css_selector("*")[0].text
            print(message)
            break

基本上,在开始时,我创建了类 .null (消息框)的所有元素的列表,并在无限循环中再次创建该列表并检查它是否不同。如果是,则表示有新消息到达。

有没有更好的方法来做到这一点,希望没有无限循环?

最佳答案

您可以使用显式等待来等待消息 null 元素消失

messageList = driver.find_elements_by_css_selector('.null')
try:
    WebDriverWait(driver, 60).until(expected_conditions.staleness_of(messageList[1]))
    message = element[1].find_elements_by_css_selector("*")[0].text
    print(message)
except TimeoutException:
    # no new message

这将等待 60 秒,以便 messageList 中的第二项从 DOM 中消失,即您有新消息。如果有新消息,代码将继续消息打印,否则将出现TimeoutException

Edit

要运行一段时间,您可以设置计时器

now = time.time()
howLong = now + 10
while time.time() < howLong:
    waitForNextMessage()
    pass

要在其他测试之外持续运行此测试,您可以在线程中运行 waitForNextMessage()

Edit 2

expected_conditions.staleness_of() 是元素不附加到 DOM 的期望。您可以找到更多预期条件here

关于python - Selenium : Better method to check for AJAX changes other than an infinite loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35128470/

相关文章:

javascript - 运行使用 XMLHttpRequest 下载的 JavaScript

file-upload - 我们如何使用 Selenium IDE 处理上传文件组件?

python selenium chrome 警报不可调用?

selenium - "Save password for this website"与 ChromeDriver 的对话框,尽管许多命令行开关试图抑制此类弹出窗口

python - 如何以安全的方式从外部访问 PostgreSQL 数据库

python - 在我输入的某些路径中保存文件时出现问题

python - 我的套接字正在使用哪个端口

python - Facebook 消息的未知编码

php - 在数据库中搜索许多参数 php jquery ajax

javascript - 当 multipule 运行时,将加载图标附加到 Table TD 以进行 ajax 调用会混淆