量角器 - 选择文本

时间:2014-09-02 09:48:43

标签: javascript angularjs selenium webdriver protractor

我在使用量角器选择一些文本时遇到了一些麻烦。

一点背景;这是一个用于撰写新闻文章的AngularJS CMS系统。我想要突出显示的文本位于文本区域内,该文本区域是页面的大部分内容。类似的应用程序是Google Docs文档。

使用webdriver,我相信我可以简单地使用这个效果:

browser.actions().keyDown(protractor.Key.CTRL).sendKeys('a').perform();

但是,我在MAC上编码,虽然目前我们的测试是在SauceLabs的Windows框中运行,但最终目标是转移到MAC来模拟我们的用户。

我尝试使用类似的代码行,但使用Command(或CMD),但它不起作用,根据this post,OSX不支持本机键事件。

我探索过的其他方法:

  1. 尝试在元素中单击三次以选择所有文本...但我无法使其工作(任何帮助?)。由于鼠标光标必须在文本上方以突出显示所有文本,因此这很复杂。

  2. 在我的本地计算机上的字段内双击可以选择文本区域中的最后一个工作,但在SauceLabs中,浏览器较小,因此设法选择不同的单词。这使用起来太脆弱,因为在大多数机器上会有所不同。

  3. 将文本光标移动到文本区域的开头或结尾,按住Shift键,然后根据文本区域中的字符数按左箭头键或右箭头键。我无法将光标移动到此实现中文本字段的开头或结尾。

  4. 感谢阅读,我意识到这有点长!如果你能想到我还没想过的方法或者用三重点击或箭头键方法编码的方法,那将非常有用!

5 个答案:

答案 0 :(得分:2)

好的,我设法通过使用.executeScript方法以编程方式选择文本来解决这个问题。

这有点像作弊,因为它不模仿用户的互动,但我找不到替代方案,它被认为是可接受的解决方案。

如果您感兴趣,这是代码,这将选择文本区域中的第一段:

Article.prototype.selectFirstParagraph = function(driver) {
    driver.executeScript(function () {
        var range = document.createRange();
        range.selectNode(document.body.querySelector('.ui-rich-text-editor__input').firstChild);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
        return sel;
    });
}

答案 1 :(得分:1)

对于那些正在寻找窗户的人。

var Key = protractor.Key;
var Key = protractor.Key;
browser.actions().sendKeys(Key.chord(Key.CONTROL, 's')).perform();
browser.actions().sendKeys(Key.chord(Key.CONTROL, Key.SHIFT, 'm')).perform();
browser.actions().sendKeys(Key.chord(Key.CONTROL, 'o')).perform();

Source Link

答案 2 :(得分:0)

在OSX上无法使用,请参阅issue 690

答案 3 :(得分:0)

根据Selenium驱动程序和MacOS的问题,COMMAND键事件未正确传播。 https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/3101

答案 4 :(得分:0)

我遇到的情况是,我发现的数十种解决方案和变通办法都没有奏效。不确定它是否与操作系统有关,还是只是输入字段为数字和自动格式的特定情况。

以下是对我有用的解决方法,我认为其他人可能会觉得有用(与操作系统无关,包括 macOS):

  const someInput = element(by.css('input#someId'));
  replaceInputValue(someInput, 'my new value');

  async function replaceInputValue(input: ElementFinder, newValue: string) {
    const valLength = (await input.getAttribute('value')).length;
    await input.sendKeys(
      ...Array(valLength).fill(protractor.Key.BACK_SPACE),
      newValue);
  }