使用Selenium 2执行复制和粘贴

时间:2012-07-31 23:21:32

标签: selenium selenium-webdriver

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

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

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

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

9 个答案:

答案 0 :(得分:17)

实际上非常简单:

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

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

答案 1 :(得分:14)

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

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

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

所以在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)

答案 2 :(得分:4)

不是使用实际的键盘快捷键,而是让webdriver获取文本。您可以通过查找元素的内部文本来完成此操作。

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

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

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

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

其中element2是将文本粘贴到

的元素

答案 3 :(得分:3)

我目前无法在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()语句只是为了能够看到这些步骤,它们当然不是程序运行所必需的。

ActionChain send_key只是切换到所选元素并在其上执行send_keys

答案 4 :(得分:2)

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

动作类:硒提供的动作类用于处理键盘和鼠标事件

///

/// 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元素。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

$this->getAllCategoriesProducts($categroyId)->paginate(8)

当您尝试粘贴某些东西时,它可以在macOS Catalina上正常运行。

答案 7 :(得分:1)

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

但是,一切都不会丢失,因为您可以在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)

答案 8 :(得分:0)

如果您使用的是 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);