所以我正在使用 Selenium 的 JavaScript 实现,WebDriverJS。与任何 Web 浏览器自动化一样,最大的障碍是让代码变慢足够长的时间以加载页面元素。我的解决方案是这样的:
对于我想与之交互的每个元素,我都有一个这样的代码块
xpath = "//div[@id='gs_lc0']/input[@id='gbqfq']"
driver.wait(function(){
return waitForElement(xPath,driver);
});
try{
element = driver.findElement(webdriver.By.xpath(xPath));
}catch(e){
console.log("Wait Function False Positive")
}
element.sendKeys("Let Me Google That For You\n";
以此为函数在等待函数中重复
var waitForElement = function(path, driver){
console.log("try: " + path)
try{
driver.findElement(webdriver.By.xpath(path));
}catch (e){
console.log("FAILURE")
return false;
}
console.log("SUCCESS")
return true;
}
现在这段代码有时会起作用,但有时却不起作用。我怀疑等待功能根本不起作用,我只是幸运地获得了网页加载时间。因此,为了测试这个理论,我将 try 函数添加到代码块中,但我什至无法捕获“NoSuchElementError”。所以我的问题的首要问题是,是否有其他方法可以形成 tryCatch 函数,以便捕获这些错误。
如果想要完整复制的话,这也是我的代码头部的样子
var webdriver = require('selenium-webdriver'), element
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('google.com');
最佳答案
bagelmaker 关于使用 findElements
的建议不错。当我想检查一个元素是否存在而不是摆弄异常时,我通常会这样做。
但是,为了完整起见,以下是当元素不存在时您将如何处理生成的错误:
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('http://www.google.com');
driver.findElement(webdriver.By.id("fofofo")).then(null, function (err) {
if (err.name === "NoSuchElementError")
console.log("Element was missing!");
});
driver.quit();
then
的第二个参数是一个 errback,它在 findElement
失败时被调用。因为 selenium-webdriver
以 promises 运行,所以这就是您必须捕获错误的方式。使用 try...catch
无法工作,因为 Selenium 不会立即开始工作;您要求 Selenium 使用 findElement
执行的工作将在未来的不确定时间执行。到那时,JavaScript 执行将移出您的 try...catch
。
上面的代码搜索 id
值为 fofofo
的元素,该元素不存在且失败。
关于javascript - 如何使用 WebDriverJS 捕获 Selenium 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636402/