27

有没有办法使用 Selenium 2 和 Python 绑定来执行复制和粘贴?

我已突出显示要复制的元素,然后执行以下操作

copyActionChain.key_down(Keys.COMMAND).send_keys('C').key_up(Keys.COMMAND)

但是,突出显示的文本不会被复制。

4

9 回答 9

26

要在 Mac 和 PC 上执行此操作,您可以使用这些备用键盘快捷键进行剪切、复制和粘贴。请注意,其中一些在物理 Mac 键盘上不可用,但可以使用旧键盘快捷键。

在 Mac 上用于剪切、复制和粘贴的备用键盘快捷键

  • 剪切 => 控制+删除,或控制+K
  • 复制 => 控制+插入
  • 粘贴 => shift+insert,或 control+Y

如果这不起作用,请改用 Keys.META,这是替换命令 ⌘ 键的官方密钥

来源: https ://w3c.github.io/uievents/#keyboardevent

这是一个功能齐全的示例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

browser = webdriver.Safari(executable_path = '/usr/bin/safaridriver')
browser.get("http://www.python.org")
elem = browser.find_element_by_name("q")
elem.clear()
actions = ActionChains(browser)
actions.move_to_element(elem)
actions.click(elem) #select the element where to paste text
actions.key_down(Keys.META)
actions.send_keys('v')
actions.key_up(Keys.META)
actions.perform() 

所以在 Selenium (Ruby) 中,这大致类似于选择元素中的文本,然后将其复制到剪贴板。

# double click the element to select all it's text
element.double_click 

# copy the selected text to the clipboard using CTRL+INSERT
element.send_keys(:control, :insert)
于 2016-12-08T18:21:20.713 回答
25

其实很简单:

from selenium.webdriver.common.keys import Keys

elem = find_element_by_name("our_element")
elem.send_keys("bar")
elem.send_keys(Keys.CONTROL, 'a') # highlight all in box
elem.send_keys(Keys.CONTROL, 'c') # copy
elem.send_keys(Keys.CONTROL, 'v') # paste

我想这可能也可以扩展到其他命令。

于 2012-08-01T08:53:43.590 回答
7

而不是使用实际的键盘快捷键,我会让 webdriver 获取文本。您可以通过查找元素的内部文本来做到这一点。

WebElement element1 = wd.findElement(By.locatorType(locator));
String text = element1.getText();

这样您的测试项目实际上可以访问文本。这对于记录目的是有益的,或者只是为了确保文本说出您想要它说的内容。

从这里您可以将元素的文本作为一个字符串进行操作,这样您就可以完全控制您在要粘贴到的元素中输入的内容。现在只是

 element2.clear();
 element2.sendKeys(text);

其中 element2 是将文本粘贴到的元素

于 2013-07-08T23:49:12.160 回答
7
elem.send_keys(Keys.SHIFT, Keys.INSERT)

当您尝试粘贴某些内容时,它在 macOS Catalina 上运行良好。

于 2019-11-09T09:13:54.260 回答
5

我目前无法在 OSX 上尝试这个,但它绝对适用于 FF 和 Ubuntu:

import os
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

with open('test.html', 'w') as fp:
    fp.write("""\
<html>
<body>
  <form>
    <input type="text" name="intext" value="ABC">
    <br>
    <input type="text" name="outtext">
  </form>
</body>
</html>
""")

driver = webdriver.Firefox()
driver.get('file:///{}/test.html'.format(os.getcwd()))
element1 = driver.find_element_by_name('intext')
element2 = driver.find_element_by_name('outtext')
time.sleep(1)
element1.send_keys(Keys.CONTROL, 'a')
time.sleep(1)
element1.send_keys(Keys.CONTROL, 'c')
time.sleep(1)
element2.send_keys(Keys.CONTROL, 'v')

这些sleep()语句只是为了能够看到步骤,它们当然不是程序运行所必需的。

ActionChainsend_key只是切换到所选元素并send_keys对其执行操作。

于 2013-04-16T12:24:07.927 回答
3

涉及发送密钥的解决方案在无头模式下不起作用。这是因为剪贴板是主机操作系统的一项功能,并且在无头运行时不可用。

然而,一切都不会丢失,因为您可以在 JavaScript 中模拟粘贴事件并在页面中使用execute_script.

const text = 'pasted text';
const dataTransfer = new DataTransfer();
dataTransfer.setData('text', text);
const event = new ClipboardEvent('paste', {
  clipboardData: dataTransfer,
  bubbles: true
});
const element = document.querySelector('input');
element.dispatchEvent(event)
于 2019-12-17T11:31:52.653 回答
3

适用于 Linux 和 MacOS 的解决方案(适用于 Chrome 驱动程序,未在 FF 上测试)

@BradParks 的答案几乎对我适用于 MacOS,除了复制/剪切部分。因此,经过一番研究,我想出了一个适用于 Linux 和 MacOS 的解决方案(代码在 ruby​​ 中)。这有点脏,因为它使用相同的输入来预先粘贴文本,这可能会产生一些副作用。如果这对我来说是个问题,我会尝试使用不同的输入,可能会使用execute_script.

  def paste_into_input(input_selector, value)
    input = find(input_selector)
    # set input value skipping onChange callbacks
    execute_script('arguments[0].focus(); arguments[0].value = arguments[1]', input, value)
    value.size.times do
      # select the text using shift + left arrow
      input.send_keys [:shift, :left]
    end
    execute_script('document.execCommand("copy")') # copy on mac
    input.send_keys [:control, 'c'] # copy on linux

    input.send_keys [:shift, :insert] # paste on mac and linux
  end
于 2019-09-16T10:41:00.007 回答
2

如果要从表格中复制单元格文本并粘贴到搜索框中,

Actions 类:用于处理键盘和鼠标事件 selenium 提供的 Actions 类

///

/// This Function is used to double click and select a cell text , then its used ctrl+c

/// then click on search box then ctrl+v also verify

/// </summary>

/// <param name="text"></param>

public void SelectAndCopyPasteCellText(string text)

{

  var cellText = driver.FindElement(By.Id("CellTextID"));

  if (cellText!= null)

  {

    Actions action = new Actions(driver);

    action.MoveToElement(cellText).DoubleClick().Perform(); // used for Double click and select the text

    action = new Actions(driver);

    action.KeyDown(Keys.Control);

    action.SendKeys("c");

    action.KeyUp(Keys.Control);

    action.Build().Perform(); // copy is performed

    var searchBox = driver.FindElement(By.Id("SearchBoxID"));

    searchBox.Click(); // clicked on search box

    action = new Actions(driver);

    action.KeyDown(Keys.Control);

    action.SendKeys("v");

    action.KeyUp(Keys.Control);

    action.Build().Perform(); // paste is performed

    var value = searchBox.GetAttribute("value"); // fetch the value search box

    Assert.AreEqual(text, value, "Selection and copy paste is not working");

  }

}

KeyDown():此方法模拟特定键盘键需要按下时的键盘动作。

KeyUp():使用 KeyDown() 方法按下的键盘键不会自动释放,因此使用 keyUp() 方法显式释放键。

SendKeys():此方法将一系列击键发送到给定的 Web 元素。

于 2020-10-01T05:05:06.733 回答
1

如果您使用的是 Serenity Framework,请使用以下代码段:

            withAction().moveToElement(yourWebElement.doubleClick().perform();
            withAction().keyDown(Keys.CONTROL).sendKeys("a");
            withAction().keyUp(Keys.CONTROL);
            withAction().build().perform();

            withAction().keyDown(Keys.CONTROL).sendKeys("c");
            withAction().keyUp(Keys.CONTROL);
            withAction().build().perform();

            withAction().keyDown(Keys.CONTROL).sendKeys("v");
            withAction().keyUp(Keys.CONTROL);
            withAction().build().perform();

            String value = yourWebElement.getAttribute("value");
            System.out.println("Value copied: "+value);

然后将此值发送到您要发送的任何位置:

destinationWebElement.sendKeys(value);
            
于 2021-05-06T20:35:02.797 回答