Неверный идентификатор сеанса при вызове SendKeys() в Selenium

#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 Спасибо за ответ! Я вызываю функцию после нажатия на элемент, который открывает модальный, так что, может быть, он завершается после щелчка? Я обновил сообщение, чтобы дать больше контекста.