【问题标题】:Type Error By.css(tagName)类型错误 By.css(tagName)
【发布时间】:2016-06-09 21:39:51
【问题描述】:

我似乎无法弄清楚导致 typeError 的原因或原因。基本上我要做的就是获取当前选定帧的名称。下面是代码和错误。

this.getCurrentFrameName = function(driver)
{
    var frames = driver.findElements(driver.By.css('frame'));
    for (var frame in frames)
    {
        if (frame.isSelected()) {
            return frame.getName;
        }
    }
};

错误

TypeError: Cannot read property 'css' of undefined
at getCurrentFrameName (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\src\FrameHandler.js:21:75)
at Context.<anonymous> (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\test\FrameHandlerTest.js:17:29)
at callFn (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runnable.js:315:21)
at Test.Runnable.run (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runnable.js:308:7)
at Runner.runTest (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runner.js:422:10)
at C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runner.js:533:12
at next (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runner.js:342:14)
at C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runner.js:352:7
at next (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runner.js:284:14)
at Immediate._onImmediate (C:\Users\charles.sexton\WebstormProjects\JS-Selenium-Toolkit\node_modules\mocha\lib\runner.js:320:5)

编辑:我想在测试中包含所有内容,但仍然遇到与以前相同的错误。我没有包含期望、断言或应该声明。

var expect = require('chai').expect;
var FrameHandler = require('../../JS-Selenium-Toolkit/src/FrameHandler.js');

var webdriver = require('selenium-webdriver');
/** required imports for Google Chrome without setting the PATH environment variable */
var chrome = require('selenium-webdriver/chrome');
var chromePath = require('selenium-chromedriver').path;

describe('FrameHandler', function()
{
var frameHandler = new FrameHandler();

it('', function()
{
    var service = new chrome.ServiceBuilder(chromePath).build();
    chrome.setDefaultService(service);

    var driver = new webdriver.Builder()
        .withCapabilities(webdriver.Capabilities.chrome())
        .build();

    driver.get('http://google.com');

    var frames = driver.findElements(driver.By.css('frame'));
    console.log(frames.length());
    for (var frame in frames)
    {
        console.log(frame.getName);
        if (frame.isSelected()) {
            console.log(frame.getName);
            return frame.getName;
        }
    }
});

});

【问题讨论】:

  • 当您在findElements 行上键入By 时,您想引用什么?也许你想要driver.css... 虽然我不确定driver 到底是什么类型的对象。
  • 这是我的驱动对象; driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .build();
  • 那么这个对象有By属性吗?
  • 我只是在读这个...stackoverflow.com/questions/18288333/… - 也许你需要使用By.cssSelector
  • @CharlesSexton 我不熟悉 Javascript 语言绑定,但我认为你应该尝试 - iframes = driver.findElements(webdriver.By.tagName('iframe')) 或 'iframes = driver.findElements(webdriver.By.tagName('frame'))'

标签: node.js selenium-webdriver


【解决方案1】:

正如@amitbobade 刚刚观察到的,By 不是构造的构建器对象driver 的属性,而是 selenium-webdriver API 实例webdriver 的属性。

(对于任何 Java 读者来说,这相当于尝试在 WebDriver instance 而不是 WebDriver class 上调用 By.css()。)

所以使用webdriver.By,而不是driver.By

您可以使用console.log 查看差异。如果您在 webdriver 上执行此操作,您会看到以下内容:

webdriver =  { ActionSequence: [Function: ActionSequence],
  Browser: 
   { ANDROID: 'android',
     CHROME: 'chrome',
     [...]
     HTMLUNIT: 'htmlunit' },
  Builder: [Function: Builder],
  Button: { LEFT: 0, MIDDLE: 1, RIGHT: 2 },
  By: 
   [Function: name(name) {
       return By.css('*[name="' + escapeCss(name) + '"]');
     }],
  Capabilities: [Function: Capabilities],
  Capability: 
   { ACCEPT_SSL_CERTS: 'acceptSslCerts',
   [...]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2022-11-30
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多