select 通过鼠标光标/键盘动作/动作的元素内文的一部分class

select a part of a innertext of an element through mouse cursor / keyboard action / Action class

如何 select 使用鼠标光标/键盘操作/操作从元素的内部文本中 select 特定单词(在本例中为“into force”)class。

我正在使用 Selenium(3.141.59) + Java (1.8) + Cucumber Framework + Selenium Grid (4)

你能不能请我说一下。

感谢和问候 萨蒂亚布拉塔

https://i.stack.imgur.com/pytUm.png

Select 带有 JavaScriptExecutor

的部分文本

这是关于如何 select 一些文本的纯 JavaScript 示例。 startend是文本select离子范围的开始和结束坐标。

function selectText(element, start, end) {
    selection = window.getSelection();        
    range = new Range();
    range.setStart(element.childNodes[0], start);
    range.setEnd(element.childNodes[0], end);
    selection.removeAllRanges();
    selection.addRange(range);
}

selectText(document.querySelector("#PageContent > h2:nth-child(7)"), 5, 20);

这应该使用 WebDriver 执行:

String jsScript = "function selectText(element, start, end) {\n" +
        "    selection = window.getSelection();        \n" +
        "    range = new Range();\n" +
        "    range.setStart(element.childNodes[0], start);\n" +
        "    range.setEnd(element.childNodes[0], end);\n" +
        "    selection.removeAllRanges();\n" +
        "    selection.addRange(range);\n" +
        "}\n" +
        "\n" +
        "selectText(arguments[0], arguments[1], arguments[2]);";

WebElement someElementWithText = driver.findElement(...);
int start = 5;
int end = 20;
((JavascriptExecutor) driver).executeScript(jsScript, someElementWithText, start, end)

这将 select 从字母 5 到字母 20 的部分文本。

如果您喜欢 select 来自 some start text 且以 some end text 结尾的文本:

String fullText = someElementWithText.getText();
int start = fullText.indexOf("some start text");
int end = fullText.lastIndexOf("some end text") + "some end text".length();

Select 带有 WebDriver 操作的部分文本

这可能可以通过 Actions 链来解决,但是鼠标移动的坐标应该通过实验来定义。而且它高度依赖于元素宽度,浏览器 window 宽度,所以它不是很稳定。

但总的来说,这会起作用:

只是 x1x2 应该根据您的要求定义。

x=0, y=0 - 是元素中心。

ChromeOptions options = new ChromeOptions();
WebDriver driver = new ChromeDriver(options);

driver.get("https://docs.oracle.com/javase/tutorial/essential/environment/env.html");

Thread.sleep(3000);

WebElement textContainer = driver.findElement(By.xpath("//h2[2]"));
int x1 = ...;
int x2 = ...;
new Actions(driver)
        .moveToElement(textContainer, x1, 0)
        .clickAndHold()
        .moveToElement(textContainer, x2, 0)
        .release()
        .build().perform();

您可以尝试使其更加灵活,同时以编程方式获取元素:

int width = textContainer.getSize().getWidth();

并尝试相对于元素宽度定义 x1x2,例如:

int x1 = -4*(width/10); // take 40% (of the full width) to the left from elements center
int x2 = -5*(width/100); // take 5% to the left from elements center