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

How can I enter an email address into text input field in Edge using Selenium WebDriver?

我有以下程序:

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".

知道我能做什么吗?

这个问题曾经出现在旧的浏览器中。显然它在 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");

我只是添加了一行来单击文本字段然后发送密钥,我尝试了这个并且它对我有用。 代码是用 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");

先尝试清除文本字段。

尝试关注

driver.FindElement(By.Id("email")).clear().SendKeys("dummy@user.de");

你试过复制粘贴吗?

Clipboard.SetText("dummy@user.de");
email.SendKeys(OpenQA.Selenium.Keys.Control + "v");

希望对您有所帮助。

作为解决方法,您可以直接通过 ExecuteScript():

设置 input
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");

或者,您可以创建一个假输入元素,其预定义值等于电子邮件地址。 Select此输入中的文本,复制并粘贴到目标输入中。

不太好,但只能作为一种解决方法

// 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

毕竟没有我想的那么容易。 alecxe 的回答有问题:

  1. arguments[0].setAttribute('value', '...'); 仅在您第一次调用时有效。调用 element.Clear(); 后,它不再起作用。解决方法:arguments[0].value='...';
  2. 网站对 JavaScript 调用的反应与对 element.SendKeys(); 的反应不同,例如未调用更改事件。解决方法:通过 JavaScript 发送字符串的第一部分直到最后一个 "forbidden" 字符,其余部分通过 WebElement.SendKeys 发送(在此特定顺序中,如果您执行另一个 JavaScript SendKeys()之后调用同一个字段,也不会发生更改事件。

我还发现 Edge 中有更多 "forbidden" 个字符,例如口音或东欧人(我是中欧人)。 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);
}

我是 Microsoft 的 WebDriver 项目经理。我刚刚尝试在我的家用计算机 (Windows 10 build 10586) 上重现您的问题,但无法重现。您的确切测试输入了 '@' 符号。

您应该检查您是否有最新版本的 Windows 10 和 WebDriver。如果您按下 Windows 键并输入 "winver" 并按下回车键,它将打开一个包含 Windows 版本信息的弹出窗口。你想让它说

微软Windows 版本 1511(OS 内部版本 10586.104)

这是Windows10发布到public的最新版本。如果你有这个版本,你还需要相应版本的 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

请注意,它目前支持实际上是在 11 月更新之前的版本 10547。它将很快(接下来的几天)更新以支持最新的 Windows Insiders flight,build 14267。

抱歉,我不同意最后一条评论(Microsoft 的 WebDriver 程序管理器)。我可以重现这个问题。这是我的配置:

目标机器(测试运行的中心节点): 赢 10 构建 10585.104 微软边缘 25.10586.0.0 MS EdgeHTML 13.10586

硒框架: SeleniumHQ(Java):2.48.0

我正在使用 Selenium Grid 运行 我的套件。在这种情况下,我只是对实施基本测试的 Egde 进行概念测试: 1. 在本地机器(Win 7)中启动 Hub 打开控制台(管理员权限) 2. 在目标远程机器(Win 10 build 10585)中的 Hub 中注册节点打开控制台(在这种情况下没有管理员权限,因为在创建新会话时边缘挂起)。

设置我的网格并检查是否一切正常当我尝试在登录页面中写入我的帐户名时我看不到 @ 并且我的基本测试失败(错误的凭据)。

我在边缘打开的那一刻(中断点)手动引入了@,我可以看到符号。 我已将“@@@@@@@@@@@@@@”发送到文本字段,但我看不到任何内容。综上,我试了很多东西都看不到@

当我开始使用 Selenium (Java) 进行 Web 自动化测试时,我记得旧版本的 Firefox 和 Chrome 中的这种行为。我不太确定是哪一个,但它可以在旧版本中重现。

此部分基本代码(使用 pageobject 实现)适用于 Firefox 35.0 和 Chrome 48.0.2564.109,但不适用于我在评论开头放置的 Edge 版本。

WebElement 元素 = WebDriverExtensions.findElement(上下文, By.cssSelector("input[name='username'][type='email']"));

element.clear(); element.sendKeys(电子邮件);

前端开发人员正在使用 AngularJS 并验证用户的文本输入以匹配格式良好的电子邮件:

恐怕目前的Edge版本不支持这种字符的sendkeys,可能是前端在线验证的问题,Edge必须适应这些情况,因为它们很常见。

此致

上面的

None 在 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('Email')”替换为您应该使用 javascript 查找字段的内容,并将 "folder of my edge driver containing MicrosoftWebDriver.exe" 替换为正确的路径。

祝你好运!