我使用Appium进行UI测试,并使用上面的Robot Framework。我试图自动化测试iOS应用程序所需的所有服务器和服务,包括Appium服务器。这似乎导致了Appium内部的一些破坏。特别是,在调用driver.get_elements_by_accessibility_id(id)时,我们似乎陷入困境
子流程启动如下所示:
self.app = subprocess.Popen("appium", shell=True, stdout=PIPE, stderr=PIPE)
当我们删除stdout / stderr kwargs,或者让它们指向文件时,行为将恢复正常。 stdout / stderr是否存在导致此问题的依赖?
答案 0 :(得分:2)
除非您从管道中读取,例如使用PIPE
,否则不要使用out, err = self.app.communicate()
。否则,子进程可能会挂起,这就是subprocess.call()
docs warn:
请勿对此功能使用
stdout=PIPE
或stderr=PIPE
。孩子 如果它生成足够的输出到管道来填充,则进程将阻塞 OS管道缓冲区,因为没有读取管道。
subprocess.call()
不会消耗管道,因此您不应将PIPE
传递给它。 To discard output, you could use DEVNULL
instead。如果您以后不使用Popen()
,则同样适用于self.app.stdout/stderr
。