我正在使用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')来复制。我真的需要拿起那些数据 - 欢迎任何建议 - 无论是破解和变通办法,还是了解这里真正发生的事情?
答案 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()
如需更多参考,请点击以下链接:
更新:
这是我的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.CONTROL
,Keys.META
和ctrl+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复制的页面内容,我现在可以继续处理该数据。谢谢大家