Selenium Web自动化中如何将点击复制获取的字符串保存到变量
核心问题说明
getText()仅能读取元素开闭标签之间的文本节点内容,10分钟邮箱站点的邮箱地址存放在id为mail_address的input输入框中,输入框的显示内容属于value属性,getText()无法读取该属性值,这是你第一次尝试取值失败的原因。- Selenium的
click()方法没有业务返回值,执行后只会返回Promise.resolve(undefined),你将点击复制按钮的执行结果赋值给email变量,拿到的永远是空值。另外点击复制按钮是将内容写入操作系统剪贴板,Selenium默认没有系统剪贴板的读取权限,走这条路径需要额外配置浏览器启动参数,稳定性差且实现繁琐,完全没有必要。
修复后的实现代码
直接读取输入框的value属性获取邮箱地址是最稳定的方案,不需要触发复制按钮操作,同时增加等待逻辑避免页面异步渲染导致拿到空值:
const { Builder, By, until } = require('selenium-webdriver'); (async function example() { let driver = await new Builder().forBrowser('chrome').build(); driver.manage().window().maximize(); try { await driver.get('https://10minutemail.com'); // 定位邮箱输入框元素 const mailInput = await driver.wait( until.elementLocated(By.xpath('//*[@id="mail_address"]')), 5000, '邮箱输入框定位超时' ); // 等待输入框填充完邮箱地址,避免拿到空值 let email = ''; await driver.wait(async () => { email = await mailInput.getAttribute('value'); return email && email.includes('@'); }, 10000, '邮箱地址加载超时'); // 新开标签页跳转谷歌云 await driver.switchTo().newWindow('tab'); await driver.get('https://cloud.google.com/'); // 定位搜索框传入邮箱值 const searchbox = await driver.wait( until.elementLocated(By.name('q')), 5000, '搜索框定位超时' ); await searchbox.sendKeys(email); } finally { // 测试完成后可取消注释关闭浏览器 // await driver.quit(); } })();
补充:如果后续场景必须要模拟剪贴板粘贴操作,需要在初始化Chrome驱动时添加启动参数,给对应域名开放剪贴板读写权限,但对于当前需求来说,直接读取元素value传值的方案稳定性远高于剪贴板方案,优先使用前者。
内容的提问来源于stack exchange,提问作者sevil soydere
相关产品推荐
相关产品推荐

