如何在下拉量角器 e2e 测试中选择选项

IT技术 javascript angularjs selenium testing protractor
2021-01-21 19:38:40

我正在尝试从使用量角器的角度 e2e 测试的下拉列表中选择一个选项。

这是选择选项的代码片段:

<select id="locregion" class="create_select ng-pristine ng-invalid ng-invalid-required" required="" ng-disabled="organization.id !== undefined" ng-options="o.id as o.name for o in organizations" ng-model="organization.parent_id">
    <option value="?" selected="selected"></option>
    <option value="0">Ranjans Mobile Testing</option>
    <option value="1">BeaverBox Testing</option>
    <option value="2">BadgerBox</option>
    <option value="3">CritterCase</option>
    <option value="4">BoxLox</option>
    <option value="5">BooBoBum</option>
</select>

我努力了:

ptor.findElement(protractor.By.css('select option:1')).click();

这给了我以下错误:

指定了无效或非法字符串构建信息:版本:'2.35.0',修订版:'c916b9d',时间:'2013-08-12 15:42:01'系统信息:os.name:'Mac OS X' , os.arch: 'x86_64', os.version: '10.9', java.version: '1.6.0_65' 驱动信息:driver.version:未知

我也试过:

ptor.findElement(protractor.By.xpath('/html/body/div[2]/div/div[4]/div/div/div/div[3]/ng-include/div/div[2]/div/div/organization-form/form/div[2]/select/option[3]')).click();

这给了我以下错误:

ElementNotVisibleError:元素当前不可见,因此可能无法与命令持续时间或超时交互:9 毫秒构建信息:版本:'2.35.0',修订:'c916b9d',时间:'2013-08-12 15:42: 01'系统信息:os.name:'Mac OS X',os.arch:'x86_64',os.version:'10.9',java.version:'1.6.0_65'会话ID:bdeb8088-d8ad-0f49-aad9 -82201c45c63f 驱动程序信息:org.openqa.selenium.firefox.FirefoxDriver 功能 [{platform=MAC, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, version=24.0, cssSelectorsEnabled=true, databaseEnabled =true,handlesAlerts=true,browserConnectionEnabled=true,nativeEvents=false,webStorageEnabled=true,applicationCacheEnabled=false,takesScreenshot=true}]

任何人都可以帮助我解决这个问题,或者对我在这里可能做错的事情有所了解。

6个回答

对我来说就像一个魅力

element(by.cssContainingText('option', 'BeaverBox Testing')).click();
添加到 TrueWill 的评论中:此解决方案的缺点是,如果您有两个类似的选项,它将使用最后找到的选项 - 这会根据错误的选择引发错误。对我有用的stackoverflow.com/a/25333326/1945990
2021-03-15 19:38:40
小注 - 仅限 v0.22(我今天刚用这个替换了我的代码,并且必须升级才能获得它)
2021-03-29 19:38:40
有没有办法使用它来定位元素?例如有重复的状态选择菜单。
2021-04-03 19:38:40
ChristopherElementFinder是可以链接的,所以你可以:element(by.css('.specific-select')).element(by.cssContainingText('option', 'BeaverBox Testing')).click();
2021-04-04 19:38:40
请注意,您可以获得部分匹配,因此“小”将匹配“超小”。
2021-04-09 19:38:40

我遇到了类似的问题,最终编写了一个辅助函数来选择下拉值。

我最终决定我可以通过选项编号进行选择,因此编写了一个方法,该方法接受一个元素和选项编号,然后选择该选项编号。如果 optionNumber 为空,则它不选择任何内容(不选择下拉列表)。

var selectDropdownbyNum = function ( element, optionNum ) {
  if (optionNum){
    var options = element.all(by.tagName('option'))   
      .then(function(options){
        options[optionNum].click();
      });
  }
};

如果您想了解更多详细信息,我写了一篇博客文章,它还涵盖了在下拉列表中验证所选选项的文本:http : //technpol.wordpress.com/2013/12/01/protractor-and-dropdowns-validation/

即使它有效,这段代码也存在多个问题。1.options如果命令的输出总是 ,则不清楚为什么要创建变量undefined2. 为了从 elementArrayFinder 中获取一个元素,最好(也更容易)使用 .get() 方法。3. 如果您将元素传递给函数,则element.all语句将不起作用。4.现在最好用async函数。这是一个示例stackoverflow.com/a/66110526/9150146
2021-03-13 19:38:40
对我不起作用,得到 element.findElements 不是一个函数。
2021-04-10 19:38:40

一种优雅的方法创建一个类似于其他 selenium 语言绑定提供的开箱即用的抽象(例如SelectPython 或 Java 中的类)。

让我们做一个方便的包装器并将实现细节隐藏在里面:

var SelectWrapper = function(selector) {
    this.webElement = element(selector);
};
SelectWrapper.prototype.getOptions = function() {
    return this.webElement.all(by.tagName('option'));
};
SelectWrapper.prototype.getSelectedOptions = function() {
    return this.webElement.all(by.css('option[selected="selected"]'));
};
SelectWrapper.prototype.selectByValue = function(value) {
    return this.webElement.all(by.css('option[value="' + value + '"]')).click();
};
SelectWrapper.prototype.selectByPartialText = function(text) {
    return this.webElement.all(by.cssContainingText('option', text)).click();   
};
SelectWrapper.prototype.selectByText = function(text) {
    return this.webElement.all(by.xpath('option[.="' + text + '"]')).click();   
};

module.exports = SelectWrapper;

用法示例(请注意它的可读性和易用性):

var SelectWrapper  = require('select-wrapper');
var mySelect = new SelectWrapper(by.id('locregion'));

# select an option by value
mySelect.selectByValue('4');

# select by visible text
mySelect.selectByText('BoxLox');

来自以下主题的解决方案:Select -> option abstraction


仅供参考,创建了一个功能请求:Select -> option abstraction

为什么在选择功能中使用“返回”?那有必要吗?
2021-03-28 19:38:40
@Michiel 好点。如果您想显式解析click(). 谢谢。
2021-04-04 19:38:40
element(by.model('parent_id')).sendKeys('BKN01');
@Gerfried BKN01 是您要从下拉列表中选择的文本。
2021-03-17 19:38:40
@GalBracha 抱歉没让你知道
2021-03-19 19:38:40
如果您有另一个与 BKN01 共享相同前缀的选项,它将不起作用。会随机抽取一个。
2021-03-21 19:38:40
抱歉,BKN01 是什么?
2021-03-26 19:38:40
这对我来说是最正确的。使用 cssContainingText 不是您确保捕获所需的字段。试想一下,如果您有 2 个具有相同值的选择框。+1
2021-04-10 19:38:40

要访问特定选项,您需要提供 nth-child() 选择器:

ptor.findElement(protractor.By.css('select option:nth-child(1)')).click();
这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论。
2021-03-23 19:38:40
将答案表述为问题就是为什么。不知道是不是正确答案。如果是,你应该这样表述。
2021-03-23 19:38:40
@bekite 对我不起作用。当我尝试您的建议时,仍然收到错误元素不可见错误
2021-03-28 19:38:40
@jpw 是我的答案错误。或者只是我的答案的表述是错误的?
2021-03-30 19:38:40