Javascript 为什么这两个元素定位器调用的行为不同?
我正在使用JavaScript编写webdriver自动化来测试web应用程序。我有如下代码:Javascript 为什么这两个元素定位器调用的行为不同?,javascript,selenium-webdriver,Javascript,Selenium Webdriver,我正在使用JavaScript编写webdriver自动化来测试web应用程序。我有如下代码: var selenium = require('selenium-webdriver'); By = selenium.By; until = selenium.until; driver = new selenium.Builder(). withCapabilities(selenium.Capabilities.chrome()). build(); getItems = async
var selenium = require('selenium-webdriver');
By = selenium.By;
until = selenium.until;
driver = new selenium.Builder().
withCapabilities(selenium.Capabilities.chrome()).
build();
getItems = async function() {
try {
var itemsXpath = '[xpath expression]';
var items = await driver.findElements(By.xpath(itemsXpath));
console.log(items.length + ' items found');
...
}
catch(err) {
console.log(err);
}
}
这是成功的。但是,如果我将wait
行替换为:
var items = await driver.wait(until.elementsLocated(By.xpath(itemsXpath)),60000);
它没有按预期执行。既不显示以下console.log()
,也不显示catch()
块中的
从阅读中,我的印象是,如果页面上有与XPath定位器匹配的项,那么这两个函数中的任何一个都可以工作,并返回元素。但是,如果元素不在页面上,第二个公式将等待它们出现(在本例中,最长可达60000ms)
请注意,第二种编写方法不起作用,即使在调用getItems()
时屏幕上已经有这些项目。此外,程序完成的时间比driver.wait()
中指定的超时时间要短
我是否误解了它的工作原理,以至于这种行为实际上是有意义的?如果是这样的话,有人能澄清一下这是怎么回事吗?你写的那句话:
var items = await driver.findElements(By.xpath(itemsXpath));
如果给定的xpath与任何元素匹配,将检查元素并返回Array
但是您使用的等待方法:
var items = await driver.wait(until.elementsLocated(By.xpath(itemsXpath)),60000);
不会返回任何元素。它只是等待元素位于DOM中
无论如何,您已经指定了60秒来使用elementLocated
方法查找元素。此行将最多等待60秒,以查找与xpath匹配的元素。如果指定的xpath在不到60秒的时间内与任何元素匹配,它将在该特定时间结束等待并移动到下一行。请注意,在这种情况下不会有任何错误。因此,不可能抓住拦网
有关这方面的更多详细信息,请参阅。在“”页的this.wait()部分中,他们特别指出此构造将返回元素。他们甚至给出了一个与我在这里所做的非常类似的例子。他们所写的语句返回“如果输入条件是WebElementCondition的实例,则返回的值将是WebElementPromise。”是不正确的。您可以检查java WebDriverWait类及其方法它到底做了什么。这个类和这个类中的方法不会返回任何元素这个行为,其中driver.wait()可以返回元素,是我在测试代码中依赖的一个元素,所以我知道这个部分可以按照我的预期工作。我从未使用过webdriver的Java版本,因此该版本的工作方式可能与我所描述的不同。