Выполнение копирования и вставки с помощью 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("");
          }
       }
    }