Выполнение копирования и вставки с помощью Selenium 2
Есть ли способ выполнить копирование и вставку с использованием привязок Selenium 2 и Python?
Я выделил элемент, который я хочу скопировать, и затем выполняю следующие действия:
copyActionChain.key_down(Keys.COMMAND).send_keys('C').key_up(Keys.COMMAND)
Однако выделенный текст не копируется.
Ответы
Ответ 1
Довольно просто:
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
Я предполагаю, что это, вероятно, можно распространить и на другие команды
Ответ 2
Чтобы сделать это на Mac и на ПК, вы можете использовать эти альтернативные сочетания клавиш для вырезания, копирования и вставки. Обратите внимание, что некоторые из них недоступны на физической клавиатуре Mac, но работают из-за устаревших сочетаний клавиш.
Альтернативные сочетания клавиш для вырезания, копирования и вставки на Mac
- Cut => control + delete или control + K
- Copy => control + insert
- Вставить => shift + insert или control + Y
Если это не работает, вместо этого используйте Keys.META, который является официальным ключом, заменяющим команду ⌘ key
Источник: 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 text
element.double_click
# copy the selected text to the clipboard using CTRL+INSERT
element.send_keys(:control, :insert)
Ответ 3
Вместо того, чтобы использовать фактическое сочетание клавиш, я бы сделал webdriver получить текст. Вы можете сделать это, найдя внутренний текст элемента.
WebElement element1 = wd.findElement(By.locatorType(locator));
String text = element1.getText();
Таким образом, ваш тестовый проект может получить доступ к тексту. Это полезно для целей ведения журнала, или, может быть, просто для того, чтобы убедиться, что текст говорит о том, что вы хотите сказать.
отсюда вы можете манипулировать текстом элемента как одну строку, чтобы у вас был полный контроль над тем, что вы вводите в элемент, который вы вставляете. Теперь просто
element2.clear();
element2.sendKeys(text);
где element2 - это элемент для вставки текста в
Ответ 4
Я не могу попробовать это на 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
.
Ответ 5
Я установил Selenium на firefox, но когда я записываю процесс и делаю копию и прошёл один раз, проходя сайт сокращения URL, он оставляет мне первую сокращенную ссылку. Как я могу преодолеть проблему? Это как если бы вы проверяли сокращения для сокращений, которые сделаны с записью.
Я был бы рад помочь. Это действительно важно и немного срочно для меня.
Ответ 6
Решение для 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
Ответ 7
если вы хотите проверить копирование на функцию клипа, ниже это лучшее решение
public class Main {
public static void main(String[] args) {
// This represents a cut-copy (Ctrl+X/Ctrl+C) operation.
// The text will be copied to the clipboard
// StringSelection is a Transferable implementation
// class.
StringSelection data = new StringSelection
("This is copied to the clipboard");
Clipboard cb = Toolkit.getDefaultToolkit()
.getSystemClipboard();
cb.setContents(data, data);
// This represents the paste (Ctrl+V) operation
try {
Transferable t = cb.getContents(null);
if (t.isDataFlavorSupported(DataFlavor.stringFlavor))
System.out.println(t.getTransferData(DataFlavor
.stringFlavor));
} catch (UnsupportedFlavorException | IOException ex) {
System.out.println("");
}
}
}