所以我使用的是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();
然后是第二个参数是一个errback,如果findElement失败则调用它.因为selenium-webdriver以promises运行,所以这就是你必须捕获错误的方法.使用try … catch无法正常工作,因为Selenium没有立即开始工作;您要求Selenium对findElement执行的工作将在未来的未确定时间执行.到那时,JavaScript执行将从你的try … catch中移出.