javascript - 在 Selenium 中调用 sendKeys() 时会话 ID 无效
问题描述
更新:弄清楚我的问题是什么,您必须在每一步都做出承诺,硒才能正常工作。所以我return el.sendKeys()
从我的页面函数中添加,也从步骤定义中返回并且它工作。
我正在使用 Selenium、Chromedriver 和 Cucumber js 来测试一个反应应用程序。我可以毫无问题地单击一个元素,但是当我尝试发送用于文本输入或下拉列表的键时,它不起作用并且我收到以下警告:
NoSuchSessionError: invalid session id
From: Task: WebElement.sendKeys()
我尝试了很多不同的方法,包括使函数异步、设置不同的 chrome 选项以及在退出驱动程序之前暂停但没有任何运气。
这是我的world.js
const seleniumWebdriver = require('selenium-webdriver')
const chrome = require('selenium-webdriver/chrome')
var pageLoader = require('./pageLoader.js')
const {setWorldConstructor, setDefaultTimeout} = require('@cucumber/cucumber')
var config = require('../../config.json')
class CustomWorld {
constructor() {
this.driver = new seleniumWebdriver
.Builder()
.forBrowser(config.browser)
.setChromeOptions(new chrome.Options().headless())
.build()
pageLoader.load(this)
}
}
setDefaultTimeout(config.timeout);
setWorldConstructor(CustomWorld);
我的 hooks.js
const fs = require('fs')
var config = require('../../config.json')
Before(function() {
return this.driver.manage().window().maximize();
})
After(function (scenario, callback) {
if(scenario.result.status === Status.FAILED){
this.driver.takeScreenshot().then(function(data) {
var screenshotPath = config.screenshotFolder + scenario.pickle.name + '.png'
fs.writeFileSync(screenshotPath, data, 'base64');
});
}
this.driver.quit().then(function () {
callback();
});
});
黄瓜场景
Scenario: Add New Rule
Given I am on the app
And I click the Add Rule button
When I set the following values for the Rule Builder
| name |
| example|
步骤定义
Given(/^I am on the app$/, function () {
return this.homePage.open()
})
Given(/^I click the Add Rule button$/, function () {
return this.homePage.clickAddRule()
})
When(/^I set the following values for the Rule Builder$/, function (table) {
const table_hash = table.hashes()[0]
for (const entry in table_hash){
this.createRulePage[entry](table_hash[entry])
}
})
主页.js
const HomePage = Object.create(Page, {
open: {
value () {
return this.browser.get('http://localhost:3000/')
}
},
clickAddRule: {
value () {
return this.browser.findElement(By.css("button.c-button")).click()
}
}
})
module.exports = HomePage
createRule.page.js
const CreateRulePage = Object.create(Page, {
name: {
value(name) {
var el = this.browser.wait(until.elementLocated(By.css("[data-testid='name']")), 1000)
el.clear()
el.click()
el.send(name)
}
}
})
module.exports = CreateRulePage
我已经阅读了大约 100 篇帖子,试图找到解决方案,但似乎没有任何效果。任何帮助都会很棒,谢谢!
解决方案
推荐阅读
- php - Laravel:如何从表中获取除第一行之外的所有行?
- android - 应用自定义线程池内的迷你线程池
- python - Python Discord 表情符号机器人
- flutter - 在导航到下一个选项卡之前显示消息对话框
- python - 如何在指数分布的尾部生成随机数?
- flutter - 我在颤振应用程序中获得了两个 appBar。我正在尝试在 Flutter 应用程序中添加 Drawer 小部件和 TabBar 小部件
- c# - Playwright C# - 等待输入文本为空
- r - 在 R Shiny 中,如何从运行反应函数中消除“警告:if 中的错误:参数长度为 0”?
- php - .ics 文件通过 PHP Laravel Mail 中的数据
- cocoa - VTCompressionSessionRef 动态更新像素宽度和高度