有没有办法使用 Selenium 2 和 Python 绑定来执行复制和粘贴?
我已突出显示要复制的元素,然后执行以下操作
copyActionChain.key_down(Keys.COMMAND).send_keys('C').key_up(Keys.COMMAND)
但是,突出显示的文本不会被复制。
有没有办法使用 Selenium 2 和 Python 绑定来执行复制和粘贴?
我已突出显示要复制的元素,然后执行以下操作
copyActionChain.key_down(Keys.COMMAND).send_keys('C').key_up(Keys.COMMAND)
但是,突出显示的文本不会被复制。
要在 Mac 和 PC 上执行此操作,您可以使用这些备用键盘快捷键进行剪切、复制和粘贴。请注意,其中一些在物理 Mac 键盘上不可用,但可以使用旧键盘快捷键。
如果这不起作用,请改用 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)
其实很简单:
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
我想这可能也可以扩展到其他命令。
而不是使用实际的键盘快捷键,我会让 webdriver 获取文本。您可以通过查找元素的内部文本来做到这一点。
WebElement element1 = wd.findElement(By.locatorType(locator));
String text = element1.getText();
这样您的测试项目实际上可以访问文本。这对于记录目的是有益的,或者只是为了确保文本说出您想要它说的内容。
从这里您可以将元素的文本作为一个字符串进行操作,这样您就可以完全控制您在要粘贴到的元素中输入的内容。现在只是
element2.clear();
element2.sendKeys(text);
其中 element2 是将文本粘贴到的元素
elem.send_keys(Keys.SHIFT, Keys.INSERT)
当您尝试粘贴某些内容时,它在 macOS Catalina 上运行良好。
我目前无法在 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
对其执行操作。
涉及发送密钥的解决方案在无头模式下不起作用。这是因为剪贴板是主机操作系统的一项功能,并且在无头运行时不可用。
然而,一切都不会丢失,因为您可以在 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)
适用于 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
如果要从表格中复制单元格文本并粘贴到搜索框中,
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 元素。
如果您使用的是 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);