我正在使用以下代码检查新消息是否已到达Facebook消息:

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


  编辑


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

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


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


  编辑2


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

关于python - Selenium :检查无限循环以外的AJAX变化的更好方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35128470/

10-12 21:05