使用Selenium Python复制文本字段值时,HTML表单没有返回剪贴板?

时间:2018-05-17 07:25:50

标签: python-2.7 selenium selenium-webdriver clipboard html-form

我正在使用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上,但没有任何改变。有没有办法绕过这个问题甚至黑客攻击?

更新: 所以,问题在于我正在使用文字字段,我可以send_keys输入文字,但无法通过{{1}获取其内容以及使用上述方法复制粘贴。我的目标是获取其内容并在我的脚本中进一步处理它。这可能是什么问题,我可以真正尝试解决这个问题?

更新: 使用命令链(下面的答案)执行复制和粘贴。但我的剪贴板没有内容,即返回空白值。与.text方法相同。可能是什么问题?有形式的东西吗?

这是我的表单html:

webDriver Element.text

更新: 所以我选择右键单击并复制上下文菜单,因为这些方法似乎都没有工作。然而,即使使用上下文菜单,我也无法通过Keys.DOWN_ARRAY或send_keys('c','c')来复制。我真的需要拿起那些数据 - 欢迎任何建议 - 无论是破解和变通办法,还是了解这里真正发生的事情?

3 个答案:

答案 0 :(得分:0)

你可以为此尝试行动:

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()  

如需更多参考,请点击以下链接:

WebDriver API

更新

这是我的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"), "");

答案 1 :(得分:0)

假设您正在使用Safari,我在3月份用苹果提出了这个问题。

https://bugreport.apple.com/web/?problemID=38222248(虽然您无法看到此错误,因为它们未向其他用户展示)。

我正在使用:
mac OS: High Sierra 10.13.3
Safari技术预览:第50版(Safari 11.2,WebKit 13606.1.5)
Selenium-java: 3.7.1
JDK: 1.8.0_161

我尝试了很多替代方法来触发复制事件(COMMAND+C),但没有成功,包括:
input.sendKeys(Keys.COMMAND, "c");
使用Keys.CONTROLKeys.METActrl+insert而不是命令

我通过电子邮件确认我的错误报告已被查看,但此后一无所获。

我没有找到一个解决方法,除了单独从多个webelements中提取文本并将其组合起来创建整个字符串,好像它是用ctrl + a和ctrl + c复制的一样。

如果我从苹果那里听到回复,我会更新这个问题。

这是我的bug演示代码。在运行脚本之前,请使用一些已知文本预填充OS剪贴板(只需手动突出显示并复制一些文本)

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命令键不适用于具有selenium自动化的safaridriver的副本

Apple于18年7月2日更新了此评论:
正在研究解决方案。我们会在可用时再次与您联系。

由苹果于18年7月17日更新,评论如下:
我们认为此问题已在最新的macOS 10.14 beta中得到解决

答案 2 :(得分:-1)

虽然这可能不是优雅或正确的方法,但我设法完成工作,即使用浏览器自动化复制粘贴。因此HTML输入字段返回null,因此我使用了复制粘贴。 Command + A没有工作,所以使用了手动选择key_down左移并按下right_arrow 300次以使用Action chaining选择我的全文。 Command + C当时没有工作,所以我尝试了context_menu,它再次起作用但我无法通过send_keys('c')两次或者arrow_down六次从菜单中选择复制选项。相反,我在Mac上发现了一个有用的技巧(不确定Linux或win),你可以通过控制和插入来复制。这有点像魅力吗?我的xerox.paste()具有由selenium复制的页面内容,我现在可以继续处理该数据。谢谢大家