首页 > 解决方案 > 在 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 篇帖子,试图找到解决方案,但似乎没有任何效果。任何帮助都会很棒,谢谢!

标签: javascriptnode.jsseleniumselenium-chromedrivercucumberjs

解决方案


推荐阅读