有什么方法可以通过webdriver在浏览器屏幕上选择一行文字来模拟键盘或鼠标?

时间:2011-07-11 15:01:31

标签: selenium webdriver

我想使用WebDriver在浏览器屏幕中选择一行文本(实际上在CKEditor编辑区域中),然后从CKEditor工具栏更改其文本样式。任何方法都可以做到吗?

例如,带有html代码的行如下所示:

这是一个示例行。

我尝试使用Actions来构建鼠标动作链,但由于不熟悉它而没有成功。感谢任何提示或答案。

2 个答案:

答案 0 :(得分:1)

我不确定WebDriver实际上是否可行。你想要做的是clickAndHold(...).moveByOffset(...).release(...)。不幸的是,WebDriver只允许WebElement作为clickAndHold()的参数。

我最好的建议是为此模拟JavaScript事件。然后,您可以在测试中执行以下操作:

((JavascriptExecutor) driver).executeScript(...);

我编写了用于模拟鼠标事件的代码,我使用了一些Selenium测试。虽然它并没有完全符合您的要求,但希望它有用(希望您可以设置x / y坐标,也许这样可以使它工作):

var f = function() {
  var id  = "ext-gen1116";
  var top = document.querySelector( '#ext-gen1116:nthchild(0)' );
  var bot = document.getElementById( id ).childNodes[3];

  var getX = function( obj ) {
    if( obj == null ) {
      return 0;
    } else {
      return obj.offsetLeft + getX( obj.offsetParent );
    }
  }

  var getY = function( obj ) {
    if( obj == null ) {
      return 0;
    } else {
      return obj.offsetTop + getY( obj.offsetParent );
    }
  }

  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("mousedown", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
  bot.dispatchEvent(evt);

  evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("mousemove", true, true, window,
    0, 0, 0, getX( top ) - getX( bot ), getY( top ) - getY( bot ),
    false, false, false, false, 0, null);
  bot.dispatchEvent(evt);

  var mouseup = function( elem ) {
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("mouseup", true, true, window,
      0, 0, 0, 0, 0, false, false, false, false, 0, null);
    elem.dispatchEvent(evt);
  }

  setTimeout( mouseup, 500, bot );
};
f();

如果你可以用键盘做你想做的事,那么这是迄今为止更好的解决方案。你可以简单地做driver.sendKeys(...)。在这种情况下,Keys枚举对你来说是无价的: - )

答案 1 :(得分:0)

您也可以尝试使用JavaScript:

let el = document.querySelectorAll("p")[0];
let range = document.createRange();
range.selectNodeContents(el);
window.getSelection().addRange(range);