【问题标题】:Protractor - Selecting Text量角器 - 选择文本
【发布时间】:2014-10-26 13:08:06
【问题描述】:

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

一点上下文;这是用于编写新闻文章的 AngularJS CMS 系统。我要突出显示的文本位于页面大部分的文本区域内。 Google Docs Document 是一个类似的应用程序。

使用 webdriver,我相信我可以简单地使用一些东西来达到这种效果:

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

但是,我在 MAC 上编写代码,虽然目前我们的测试是在 SauceLabs 的 windows 盒子上运行的,但最终目标是迁移到 MAC 以模拟我们的用户。

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

我探索过的其他方法:

  1. 尝试在元素中单击三次以选择所有文本...但我无法让它工作(有什么帮助吗?)。这很复杂,因为鼠标光标必须在文本上方才能突出显示所有文本。

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

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

感谢阅读,我知道这篇文章有点长!如果您能想到一种我还没有想到的方法,或者一种编写三次单击或箭头键方法的方法,那将非常有帮助!

【问题讨论】:

  • '鼠标光标必须在文本上'你是否尝试过 mouseOver(element,offset),其中 offset = {x:somePixel,y:somePixel}?
  • 嗨@nilsK,感谢您的回复。我认为(如果我错了,请纠正我),偏移量是否会以像素为单位,因此也取决于窗口大小?如果是这样,这将是一种非常脆弱的工作方式,因为它在大多数计算机上都会有所不同。另外,只是好奇,除了测试通过之外,您如何调试才能知道何时拥有正确的偏移量?
  • 是的,偏移量以像素为单位,我猜这是个坏主意。我在悬停带有圆角的元素时遇到问题,2-3 像素的偏移量有帮助。不过可能对你没有帮助。无论如何,为了获得正确的偏移量,我使用 chrome 并且它的开发工具包含一个标尺;) F12 -> 单击“设置轮”-> 元素“显示标尺”
  • 感谢@nilsK 的解释

标签: javascript angularjs selenium webdriver protractor


【解决方案1】:

好的,我设法通过使用 .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;
    });
}

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      我遇到了我发现的几十个解决方案和变通方法都不起作用的情况。不确定它是否与操作系统有关,或者只是输入字段是数字和自动格式化的特定情况。

      这是对我有用的解决方法,我认为其他人可能会觉得有用(与操作系统无关,包括 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);
        }
      

      【讨论】:

        【解决方案4】:

        在 OSX 上是不可能的,请参阅 issue 690

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-29
            • 2020-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-20
            • 2019-04-18
            • 1970-01-01
            相关资源
            最近更新 更多