使用selenium-webdriver时setInterval回调中await报语法错误求助
问题分析与解决方案
首先,你遇到的SyntaxError: Unexpected identifier并不是driver变量的作用域问题,核心原因是你在setInterval的回调函数里使用了await,但这个回调函数没有被声明为async函数——JavaScript明确规定,只有在async标记的函数内部,才能使用await关键字,否则会直接抛出语法错误。
另外还有一个容易忽略的隐藏问题:你的finally块里直接调用了await driver.quit(),但setInterval是异步执行的,example函数会在启动定时器后立刻走到finally逻辑,导致浏览器被提前关闭,后续定时器里的driver操作都会直接失败。
具体修复步骤
1. 给setInterval回调添加async声明
把回调函数改成async () => {...}的形式,这样内部的await就能被正常识别了。
2. 调整driver.quit的执行时机
不能在example函数的finally里直接关闭浏览器,否则定时器还没开始工作就丢失了驱动实例。你可以设置一个终止条件(比如运行N次后停止),或者在需要结束任务时再主动调用driver.quit()。
3. 别忘了给getAttribute也加await
image.getAttribute('src')本身也是异步操作,返回的是Promise对象,必须用await才能拿到实际的src字符串值。
修复后的完整代码
const {Builder, By, Key, until} = require('selenium-webdriver'); var firefox = require('selenium-webdriver/firefox'); var FirefoxProfile = require('firefox-profile'); FirefoxProfile.copyFromUserProfile({name: 'foobar'}, function(err, profile) { var opts = new firefox.Options(); opts.setProfile(profile.profileDir); (async function example() { let driver = await new Builder().forBrowser('firefox').setFirefoxOptions(opts).build(); try { await driver.get('http://google.com'); var myTimer = setInterval(async () => { // 给回调添加async声明 try { var image = await driver.findElement(By.xpath("//img")); var imageSrc = await image.getAttribute('src'); // 这里也要加await console.log('当前图片src:', imageSrc); } catch(timerErr) { console.log('定时器执行出错:', timerErr); } }, 1000*10); // 示例:运行5次后自动停止并关闭浏览器 setTimeout(() => { clearInterval(myTimer); driver.quit().then(() => console.log('浏览器已关闭')); }, 1000*10*5); } catch(err) { console.log('初始化过程出错:', err); await driver.quit(); } })(); });
额外提示
给定时器的回调单独加上try/catch很重要,这样就算某次获取图片的操作失败,也不会导致整个定时器停止工作,程序的鲁棒性会更高。
内容的提问来源于stack exchange,提问作者Vikas Rathod
相关产品推荐
相关产品推荐

