我有以下程序:
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Edge;
namespace ConsoleApplication1
{
static class Program
{
static void Main()
{
//var driver = new ChromeDriver();
var driver = new EdgeDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(20));
driver.Navigate().GoToUrl("http://www.cornelsen.de/shop/registrieren-lehrer");
driver.FindElement(By.Id("email")).SendKeys("dummy@user.de");
}
}
}
当我在Chrome或除Edge之外的任何其他浏览器中运行此功能时,系统会正确输入电子邮件地址。但如果我在Edge中尝试相同的操作,则会丢失“@”字符。该字段仅显示“dummyuser.de”。
知道我能做什么吗?
答案 0 :(得分:1)
作为解决方法,您可以直接通过input
设置ExecuteScript()
值:
IWebElement email = driver.FindElement(By.Id("email"));
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string script = "arguments[0].setAttribute('value', 'arguments[1]');";
js.ExecuteScript(script, email, "dummy@user.de");
或者,您可以做的是使用等于电子邮件地址的预定义值创建虚假输入元素。选择此输入中的文本,复制并粘贴到目标输入中。
不漂亮,但应仅用作解决方法:
// create element
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string script = @"
var el = document.createElement('input');
el.type = 'text';
el.value = 'arguments[0]';
el.id = 'mycustominput';
document.body.appendChild(el);
";
js.ExecuteScript(script, "dummy@user.de");
// locate the input, select and copy
IWebElement myCustomInput = driver.FindElement(By.Id("mycustominput"));
el.SendKeys(Keys.Control + "a"); // select
el.SendKeys(Keys.Control + "c"); // copy
// locate the target input and paste
IWebElement email = driver.FindElement(By.Id("email"));
email.SendKeys(Keys.Control + "v"); // paste
答案 1 :(得分:1)
毕竟,这并不像我想象的那么容易。 alecxe回答的问题:
arguments[0].setAttribute('value', '...');
仅在您第一次调用时才有效。致电element.Clear();
后,它不再有效。解决方法:arguments[0].value='...';
element.SendKeys();
那样对JavaScript调用做出反应,例如不调用change事件。解决方法:通过JavaScript将字符串的第一部分发送到最后一个“禁止”字符,其余部分通过WebElement.SendKeys发送(按此特定顺序,bc,如果您对之后的同一字段执行另一次JavaScript调用> SendKeys(),也不会发生任何变化事件。我也意识到Edge中有更多“禁用”字符,例如重音或东欧(我是中欧)。 2.的问题是最后一个字符可能是一个禁止的字符。在这种情况下,我附加一个空格。这当然会影响测试用例的行为,但我还没有其他任何想法。
完整的C#代码:
public static void SendKeys(this IWebElement element, TestTarget target, string text)
{
if (target.IsEdge)
{
int index = text.LastIndexOfAny(new[] { '@', 'Ł', 'ó', 'ź' }) + 1;
if (index > 0)
{
((IJavaScriptExecutor) target.Driver).ExecuteScript(
"arguments[0].value='" + text.Substring(0, index) + "';", element);
text = index == text.Length ? Keys.Space : text.Substring(index);
}
}
element.SendKeys(text);
}
答案 2 :(得分:0)
此问题曾在旧版浏览器中出现。显然它在Edge
返回。
您可以尝试分段发送字符串
IWebElement email = driver.FindElement(By.Id("email"));
email.SendKeys("dummy");
email.SendKeys("@");
email.SendKeys("user.de");
或尝试使用@
ASCII码
driver.FindElement(By.Id("email")).SendKeys("dummy" + (char)64 + "user.de");
答案 3 :(得分:0)
我刚添加了一行来点击文本字段,然后发送密钥,我尝试了这个并且它为我工作。 代码是用java编写的,如果需要,可以将其更改为任何其他代码。
//INITIALISE DRIVER
WebDriver driver = null;
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.navigate().to("http://www.cornelsen.de/shop/registrieren-lehrer");
driver.manage().window().maximize();
//CLICK EMAIL FIELD, JUST TO HAVE FOCUS ON TEXT FIELD
driver.findElement(By.id("email")).click();
driver.findElement(By.id("email")).sendKeys("dummy@user.de");
答案 4 :(得分:0)
首先尝试清除文本字段。
尝试以下
driver.FindElement(By.Id("email")).clear().SendKeys("dummy@user.de");
答案 5 :(得分:0)
您是否尝试过复制粘贴?
Clipboard.SetText("dummy@user.de");
email.SendKeys(OpenQA.Selenium.Keys.Control + "v");
希望它可以提供帮助。
答案 6 :(得分:0)
我是Microsoft的WebDriver的程序经理。我只是试图在我的家用机器上重现你的问题(Windows 10 build 10586)并且无法重现。您的确切测试输入'@'符号。
您应该检查您是否拥有最新版本的Windows 10和WebDriver。如果您点击Windows键并输入“winver”并按Enter键,则会打开一个包含Windows版本信息的弹出窗口。你想要它说
Microsoft Windows 版本1511(OS Build 10586.104)
这是向公众发布的最新版Windows 10。如果你有这个版本,你还需要在这里找到相应版本的WebDriver: http://www.microsoft.com/en-us/download/details.aspx?id=49962
请注意,如果构建版本为10240,那么您将使用原始版本构建版本。我们的11月更新为新功能添加了大量支持(比如通过XPath查找元素等等)以及可能解释您问题的错误修复。
最后我要注意,我们还有一个Insiders版本以及WebDriver与Insiders程序相匹配。如果您订阅了Insiders程序并希望查看WebDriver的新功能和错误修复,可以在此处找到下载: https://www.microsoft.com/en-us/download/details.aspx?id=48740
请注意,它目前支持的是版本10547,它实际上是在11月更新之前。它将很快(未来几天)更新,以支持最新的Windows Insiders航班,构建14267。
答案 7 :(得分:0)
很抱歉,但我不同意上一条评论(Microsoft的WebDriver项目经理)。我可以重现这个问题。这是我的配置:
目标计算机(运行测试的集线器节点): 赢10建立10585.104 MS Edge 25.10586.0.0 MS EdgeHTML 13.10586
硒框架: SeleniumHQ(for Java):2.48.0
我正在使用Selenium Grid来运行我的套件。在这种情况下,我只对Egde实施基本测试进行概念测试: 1.在本地计算机(Win 7)中打开控制台(管理员权限) 2.在目标远程计算机(Win 10 build 10585)打开控制台的Hub中注册节点(在这种情况下没有管理员权限,因为在创建新会话时边缘会以其他方式挂起)。
当我尝试在登录页面中写入我的帐户名时,设置我的网格并检查一切正常我看不到@和我的基本测试失败(错误的凭据)。
我已经打开了@手边的边缘打开(中断点),我可以看到符号。 我已将“@@@@@@@@@@@@@@@”发送到文本字段,我看不到任何内容。总之,我尝试了很多东西,我看不到@
当我开始使用Selenium(Java)进行Web自动化测试时,我记得旧版本的Firefox和Chrome中的这种行为。我不确定哪一个,但它在旧版本中是可重现的。
这个部分基本代码(使用pageobject实现)正在使用Firefox 35.0和Chrome 48.0.2564.109,但是我没有使用我在评论开始时提供的Edge版本。
WebElement element = WebDriverExtensions.findElement(context,By.cssSelector(“input [name ='username'] [type ='email']”));
element.clear(); element.sendKeys(电子邮件);
Front Developers正在使用AngularJS并验证用户的文本输入以匹配格式良好的电子邮件:
我担心当前的Edge版本不支持带有这种字符的sendkeys,可能问题是前端在线验证,而Edge必须适合这些情况,因为它们非常常见。
祝你好运
答案 8 :(得分:0)
以上所有版本都不适用于版本2.52。这对我有用:
EdgeDriver edgeDriver = new EdgeDriver("folder of my edge driver containing MicrosoftWebDriver.exe");
IJavaScriptExecutor js = _edgeDriver as IJavaScriptExecutor;
js.ExecuteScript("document.getElementById('Email').value = 'some@email.com'");
请务必更换" .getElementById('电子邮件')"用你应该用javascript找到你的字段,并替换我的边缘驱动程序包含MicrosoftWebDriver.exe的#34;文件夹"用正确的道路。
祝你好运!