如何使用Selenium WebDriver在Edge的文本输入字段中输入电子邮件地址?

时间:2016-02-11 15:05:44

标签: c# selenium selenium-webdriver microsoft-edge

我有以下程序:

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”。

知道我能做什么吗?

9 个答案:

答案 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回答的问题:

  1. arguments[0].setAttribute('value', '...');仅在您第一次调用时才有效。致电element.Clear();后,它不再有效。解决方法:arguments[0].value='...';
  2. 该网站不像element.SendKeys();那样对JavaScript调用做出反应,例如不调用change事件。解决方法:通过JavaScript将字符串的第一部分发送到最后一个“禁止”字符,其余部分通过WebElement.SendKeys发送(按此特定顺序,bc,如果您对之后的同一字段执行另一次JavaScript调用> SendKeys(),也不会发生任何变化事件。
  3. 我也意识到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;文件夹"用正确的道路。

祝你好运!