有没有办法使用Selenium 2和Python绑定执行复制和粘贴?
我突出显示了要复制的元素,然后执行以下操作
copyActionChain.key_down(Keys.COMMAND).send_keys('C').key_up(Keys.COMMAND)
但是,不会复制突出显示的文本。
答案 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键盘上不可用,但由于传统的键盘快捷键而无法使用。
所以在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);