【发布时间】:2019-03-20 00:14:49
【问题描述】:
我正在开设一门关于使用 Java 中的 selenium/web 驱动程序进行自动化/测试的新课程。 出于测试目的,我们有一个 Python Web 应用程序(使用烧瓶),它只是一个虚构博客的条目/帖子的基本 CRUD。
在解释隐式和显式等待期间,示例是插入一个新条目并使用隐式等待等待成功消息。 鉴于烧瓶应用程序在本地运行,它不足以测试等待。因此,教授在响应方法中放置了一个“time.sleep()”,因此返回消息可能需要更长的时间。
这是响应方法的摘录:
elapsed_time=randint(10,12)
time.sleep(elapsed_time)
flash("Entry '" + entry.title + "' created successfully." + str(elapsed_time), "success")
而在我们测试类的setup方法中:
@Before
public void setUp() {
System.setProperty("webdriver.chrome.driver", "C:\\ChromeDriver\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get("localhost:5000");
}
这当然会起作用,因为隐式等待设置为 15 秒,应用程序响应时间不会超过 12 秒。
问题是,如果我将等待设置为 1 秒,它仍然有效,即使我删除了整行,它仍然有效。 (不会抛出找不到元素的错误)
我问教授为什么这没有失败,为什么一直等待超过我设置的隐式等待(1 秒),他不确定。他提到他认为某处有一些默认时间,但没有给我任何精确度。
那么,为什么如果我将隐式等待设置为 1 秒,它在尝试查找消息时不会失败?
我错过了什么?
找到消息的代码是:
String currentMessage = driver.findElement(By.xpath("/html/body/div[2]/div[1]/div[1]/div/span")).getText();
System.out.println(currentMessage);
assertTrue(currentMessage.contains("Entry 'My newest post' created successfully."));
【问题讨论】:
-
你能粘贴
flash方法的代码吗?只是为了确认它正在添加到dom中,而不是简单地让某些东西可见。 -
您确定您可能不明确的 XPath 表达式不会过早匹配吗?
-
隐式等待仅在搜索元素时使用。您还必须记住,默认情况下,selenium 会在与页面交互之前尝试加载页面,这将导致(在非常基本的层面上)它等待
document.readyState为真。如果在document.readyState设置为 true 时所有元素都已加载到您的页面上,则查找任何元素都不会延迟,因此不需要隐式等待,因此不会出现错误