Javascript 量角器-选择文本
使用量角器选择文本时,我遇到了一些实际问题 一点背景;这是一个用于撰写新闻文章的AngularJS CMS系统。我要突出显示的文本位于页面大部分的文本区域内。类似的应用程序是谷歌文档 有了webdriver,我相信我可以简单地使用以下内容:Javascript 量角器-选择文本,javascript,angularjs,selenium,webdriver,protractor,Javascript,Angularjs,Selenium,Webdriver,Protractor,使用量角器选择文本时,我遇到了一些实际问题 一点背景;这是一个用于撰写新闻文章的AngularJS CMS系统。我要突出显示的文本位于页面大部分的文本区域内。类似的应用程序是谷歌文档 有了webdriver,我相信我可以简单地使用以下内容: browser.actions().keyDown(protractor.Key.CTRL).sendKeys('a').perform(); 然而,我在MAC电脑上编写代码,尽管目前我们的测试是在SauceLabs的windows机器上运行的,但最终目标
browser.actions().keyDown(protractor.Key.CTRL).sendKeys('a').perform();
然而,我在MAC电脑上编写代码,尽管目前我们的测试是在SauceLabs的windows机器上运行的,但最终目标是移动到MAC电脑上模拟我们的用户
我尝试了一行类似的代码,但使用了Command(或CMD),但它不起作用,据介绍,OSX不支持本机密钥事件
我探索过的其他方法:
感谢阅读,我意识到这有点长!如果你能想出一个我还没有想到的方法,或者一种编码三次单击或箭头键方法的方法,那将非常有用 在OSX上是不可能的,请参见好的,我通过使用.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;
});
}
对于那些正在寻找窗口的人
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();
根据Selenium驱动程序和MacOS的问题,命令键事件未正确传播。
我遇到的情况是,我发现几十种解决方案和变通办法都不起作用。不确定它是否与操作系统相关,或者只是输入字段为数字且自动格式化的特定情况 这是一个适合我的解决方案,我想其他人可能会发现它很有用(操作系统不可知论者,包括macOS):
“鼠标光标必须在文本上”您是否尝试将鼠标移到(元素,偏移量),其中偏移量={x:somePixel,y:somePixel}?您好@nilsK,谢谢您的回复。我想(如果我错了,请纠正我),偏移量是以像素为单位测量的,因此也取决于窗口大小吗?如果是这样的话,这将是一种非常脆弱的工作方式,因为它在大多数计算机上是不同的。另外,我很好奇,除了测试通过之外,你怎么能去bug知道什么时候你有正确的偏移量呢?是的,偏移量是用像素来衡量的,我想这是个坏主意。我在使用圆角悬停元素时遇到问题,偏移量为2-3像素会有所帮助。也许对你没什么帮助。无论如何,为了获得正确的偏移量,我使用了chrome,它的开发工具包含一个标尺;)F12->单击“设置轮子”->元素“显示标尺”感谢@nilsK的解释
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);
}