我正在使用以下代码检查新消息是否已到达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/