#javascript #node.js #selenium #selenium-chromedriver #cucumberjs
Вопрос:
ОБНОВЛЕНИЕ: Выяснил, в чем была моя проблема, вы должны возвращать обещание на каждом шаге, чтобы селен работал. Поэтому я добавил return el.sendKeys()
функцию со своей страницы, а также вернулся из определения шага, и это сработало.
Я использую Selenium, Chromedriver и Cucumber js для тестирования приложения react. Я могу без проблем щелкнуть по элементу, но когда я пытаюсь отправить ключи для ввода текста или выпадающего списка, это не работает, и я получаю это предупреждение:
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|
Step definitions
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])
}
})
home.page.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 сообщений so, пытаясь найти решение, но, похоже, ничего не получается. Любая помощь была бы отличной, спасибо!
Комментарии:
1. эта ошибка указывает на то, что драйвер вышел или находится в процессе выхода, когда вы пытались использовать метод webdriver. Трудно сказать, почему это происходит, не видя контекста, когда вы вызываете функцию «значение». Возможно, из-за того, что его вызвали, когда этого не должно было быть?
2. @pcalkins Спасибо за ответ! Я вызываю функцию после нажатия на элемент, который открывает модальный, так что, может быть, он завершается после щелчка? Я обновил сообщение, чтобы дать больше контекста.