Форма HTML ничего не возвращает в буфер обмена при копировании значения текстового поля с помощью Selenium Python? - PullRequest
0 голосов
/ 17 мая 2018

Я выполняю определенную задачу автоматизации с использованием python selenium (в настоящее время использую систему Mac) - и по некоторым причинам мой webElement.text ничего не возвращает для текстового поля, которое я хотел бы скопировать. Поэтому я пытаюсь скопировать и вставить значения, но по какой-то причине .send_keys работает (поскольку я могу видеть вводимые значения, перемещение курсора и т. Д., Но после шага команда + c у меня нет значений в моем буфере обмена. Я попытался вставить содержимое буфера обмена через модуль xerox, и он извлекает только те материалы, которые я ранее скопировал вручную - содержимое буфера обмена, управляемого селеном, не видно. Мне интересно, как обойти эту проблему?

/ код

from selenium.webdriver.common.keys import Keys
import xerox

elem = browser.find_elements_by_name("callback_url_0")[0]
#elem.send_keys("bar") # for testing purposes, and it works

elem.send_keys(Keys.CONTROL, 'a') #highlight all in box
elem.send_keys(Keys.CONTROL, 'c') #copy
#elem.send_keys(Keys.CONTROL, 'v') #
#xerox.copy()
xerox.paste() #this pastes my old system junk, nothing from the webdriver session

Я даже пробовал Key.COMMAND, как на Mac, но ничего не изменилось. Любой способ обойти или даже взломать эту проблему?

UPDATE: Итак, проблема в том, что я работаю с текстовым полем, в котором я могу send_keys и набирать текст, но не могу получить его содержимое, как webDriver Element.text, так и скопировать и вставить, используя выше описанный метод. Моя цель - получить его содержимое и обработать его в моем сценарии. В чем может быть проблема здесь, и что я могу действительно попытаться обойти это?

UPDATE: Используя цепочку команд (ответ ниже), выполните копирование и вставку. Но мой буфер обмена не имеет содержимого, т.е. возвращает пустое значение. Так же, как метод .text. В чем может быть проблема? Что-то с формой?

Вот мой HTML-код:

<div class="row">
<div class="col-sm-12">
<input app-vast-url-validate="" type="url" class="input-full-width ng-valid-required ng-valid-vast-url ng-dirty ng-touched ng-valid ng-valid-url" id="callback_url_0" name="callback_url_0" ng-model="callback.url" placeholder="Enter Callback URL" ng-keyup="onAddCallbackFormControl($event, callback)" required="" style="">
</div>
</div>

UPDATE: Поэтому я вместо этого выбираю правую кнопку мыши и копирую контекстное меню, так как ни один из методов не работает. Однако даже с помощью контекстного меню я не могу нажать «Копировать» с помощью клавиш Keys.DOWN_ARRAY или send_keys («c», «c»). Мне действительно нужно собрать эти данные - любые предложения приветствуются - либо хаки и обходные пути, либо понимание того, что на самом деле здесь происходит?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Предполагая, что вы используете Safari, я поднял это с яблоком еще в марте.

https://bugreport.apple.com/web/?problemID=38222248 (хотя вы не сможете увидеть эту ошибку, так как она не отображается другим пользователям).

Я использовал:
Mac OS: High Sierra 10.13.3
Предварительный просмотр технологии Safari: Релиз 50 (Safari 11.2, WebKit 13606.1.5)
Селен-Ява: 3.7.1
JDK: 1.8.0_161

Я пробовал множество альтернатив, чтобы вызвать событие копирования (COMMAND+C), но безуспешно, включая:
input.sendKeys(Keys.COMMAND, "c");
Использование Keys.CONTROL, Keys.META и ctrl+insert вместо COMMAND .

Я получил подтверждение по электронной почте, что мой отчет об ошибках был просмотрен, но с тех пор ничего не было.

Я не нашел обходного пути, кроме как извлекать текст из нескольких webelements по отдельности и комбинировать его, чтобы создать всю строку, как если бы она была скопирована с помощью ctrl + a и ctrl + c.

Я буду обновлять эту проблему, если получу ответ от Apple.

Это был мой демонстрационный код с ошибкой. Перед запуском сценария предварительно заполните буфер обмена ОС некоторым известным текстом (просто выделите и скопируйте текст вручную)

package com.sas.aft.overview;

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.safari.SafariOptions;

public class Demo {
    public static void main(String[] args) throws InterruptedException    {

    SafariOptions options = new SafariOptions();
    options.setUseTechnologyPreview(true);
    WebDriver webDriver = new SafariDriver(options);

    webDriver.navigate().to("https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_textarea");
    webDriver.switchTo().frame("iframeResult");

    Thread.sleep(1000);
    WebElement input = webDriver.findElement(By.cssSelector("textarea")); 
    input.click();

    Thread.sleep(1000);
    new Actions(webDriver).keyDown(Keys.COMMAND).sendKeys("a").keyUp(Keys.COMMAND).perform();

    Thread.sleep(1000);
    new Actions(webDriver).keyDown(Keys.COMMAND).sendKeys("c").keyUp(Keys.COMMAND).perform();
    Thread.sleep(1000);
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable contents = clipboard.getContents(null);
    try {
        System.out.print("Clipboard: " + (String)contents.getTransferData(DataFlavor.stringFlavor) + "\n"); 
    } catch (UnsupportedFlavorException | IOException ex) { 
        //ignore
    }

    webDriver.quit();
    }
}

ОБНОВЛЕНИЕ ПО SAFARI BUG
Ошибка, которую я поднял:
38222248 Клавиша управления не работает с копией для safaridriver с автоматизацией селена

Был обновлен Apple 2 июля '18 с этим комментарием:
Решение находится в стадии расследования. Мы свяжемся с вами снова, когда она будет доступна.

Был обновлен Apple 17 июля '18 с этим комментарием:
Мы считаем, что эта проблема была решена в последней бета-версии macOS 10.14

0 голосов
/ 18 мая 2018

Хотя это, вероятно, не элегантный или правильный путь, но мне удалось выполнить работу, т.е. скопировать и вставить с помощью автоматизации браузера. Итак, поле ввода HTML вернуло ноль, поэтому я прибегнул к копированию и вставке. Ctrl + A не работал, поэтому прибегал к ручному выбору смещения клавиши key_down влево и нажатию клавиши right_arrow примерно 300 раз, чтобы выбрать полный текст с помощью цепочки действий. Command + C тогда не работал, поэтому я попробовал контекстное меню, которое снова заработало, но я не смог выбрать опцию копирования из меню ни send_keys (‘c’) дважды, ни arrow_down шесть раз. Вместо этого я нашел полезный трюк на Mac (не уверенный в Linux или win), который позволяет вам копировать с контролем и вставкой. Это сработало как шарм. Мой xerox.paste () содержит содержимое страницы, скопированное селеном, и теперь я могу приступить к обработке этих данных. Спасибо всем

0 голосов
/ 17 мая 2018

Вы можете попробовать действия для этого:

key_down (значение, элемент = нет)
Отправляет только нажатие клавиши, не отпуская ее.
Должно использоваться толькос клавишами модификаторов (Control, Alt и Shift).

ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()  

key_up (значение, элемент = нет)
Отпускает клавишу-модификатор.

ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()  

Для получения дополнительной информации вы можете перейти по этой ссылке:

API WebDriver

Обновление :

Вот мой HTML:

<html>
<head>
<title>
Stack over flow
</title>
</head>
<body>
<form action="/action_page.php">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <input type="submit" value="Submit">
</form>
</div>
</body>
</html>

На этой странице есть два поля ввода , я отправляю несколько ключей в сначала установите флажок , а затем я 'я делаю CTRL+A, а затем CTRL+C.

Затем нажимаем второй блок ввода и вставляем то же самое значение .

Вот код:

driver.find_element_by_name('fname').send_keys("Deepak")
actions = ActionChains(driver)
actions.key_down(Keys.LEFT_CONTROL).send_keys('a').keyUp(Keys.LEFT_CONTROL).build().perform()
        actions.keyDown(Keys.LEFT_CONTROL).sendKeys("c").keyUp(Keys.LEFT_CONTROL).build().perform()
time.sleep(2)
element =  driver.find_element_by_name('lname')
element.click()
element.send_Keys(Keys.chord(Keys.CONTROL, "v"), "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...