我使用以下代码来检查 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/