无法使用 Selenium WebDriver 在文本框中输入值

Posted

技术标签:

【中文标题】无法使用 Selenium WebDriver 在文本框中输入值【英文标题】:Not able to enter value in Textbox using Selenium WebDriver 【发布时间】:2016-12-11 21:09:37 【问题描述】:

我正在使用 Selenium WebDriver 使用 java 在 2 textboxe 中输入文本。我可以在第一个文本框中输入文本,但对于第二个 textbox,我不断收到 ElementNotVisibleException

HTML 代码..

<form name="form">
  <div class="form-group">
      <input name="name" type="text" class="form-control" ng-model="name" placeholder="Name*" required>
   </div>
   <div class="form-group">
       <input name="email" id="email" type="email" class="form-control" ng-model="email" ng-change="(form.email.$dirty && form.email.$valid) ? error='' : error='Please enter a valid email'" placeholder="Email*" required autofocus/>
    </div>
</form>

Java 代码..

WebElement name = driver.findElement(By.name("name"));  
name.sendKeys("Sample Name");

WebElement signup_email = driver.findElement(By.name("email")); 
signup_email.sendKeys("abc@xyz.com");

错误

org.openqa.selenium.ElementNotVisibleException: 元素不是 当前可见,因此可能无法与 Command 交互 持续时间或超时:19 毫秒构建信息:版本:'2.53.1', 修订:'a36b8b1',时间:'2016-06-30 17:32:46' 系统信息:主机: 'Hp-PC', ip: '172.16.255.131', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_79' 会话 ID: 2e7ab2fd-cd6b-428e-86e7-a4f7d8d737fa 驱动程序信息: org.openqa.selenium.firefox.FirefoxDriver 功能 [平台=WINDOWS,acceptSslCerts=true,javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handleAlerts=true, nativeEvents=false, webStorageEnabled=true, 可旋转=假,locationContextEnabled=真, applicationCacheEnabled=true,takeScreenshot=true,版本=47.0.1] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678) 在 org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:327) 在 org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:122) 在 src.tests.EmailSignUp.test(EmailSignUp.java:107) 在 src.tests.EmailSignUp.main(EmailSignUp.java:27)

编辑 1

在浏览器控制台中,以下类将自动由 angular Js 填充

如果是第二个textbox,我不明白我哪里出错了。角码会引起问题吗?请帮忙..

【问题讨论】:

据我所知,您的代码没有任何问题。我猜它的问题与页面本身有关。作为一种解决方法,您可以尝试使用预期的可见性条件进行显式等待。 试过了..我得到一个 TimedOutException... :( 您可以手动输入值吗?也许你可以尝试增加时间跨度 暂停执行直到输入第一个文本框值,然后在尝试查找之前查看 element2 的状态。也许它可以给你一些信息 您是否检查过不可见元素的选择器是否匹配页面中的多个元素?您可以使用类似的 CSS:[name=email] 【参考方案1】:

可能当您要定位元素时,它不会出现在DOM 上,您应该尝试使用WebDriverWait 等待元素出现,如下所示:-

WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement name = wait.until(ExpectedConditions.presenceOfElementLocated(By.name("name")));
name.sendKeys("Sample Name");

WebElement signup_email = wait.until(ExpectedConditions.presenceOfElementLocated(By.name("email")));
signup_email.sendKeys("abc@xyz.com");

Edited1 :- 如果您在 sendKeys() 期间仍然遇到问题,我认为您的元素中嵌入了一些 javascript 使其不可见,在这种情况下尝试使用 JavascriptExecutor 设置值下面:-

WebElement signup_email = wait.until(ExpectedConditions.presenceOfElementLocated(By.name("email")));
((JavascriptExecutor)driver).executeScript("arguments[0].value = 'abc@xyz.com'", signup_email);

Edited1:- 如果您想让元素可见,如果不确定 css 在您的元素中究竟是什么工作,但下面是通用的制作方法,如下所示:-

WebElement signup_email = wait.until(ExpectedConditions.presenceOfElementLocated(By.name("email")));
signup_email = (WebElement)((JavascriptExecutor)driver).executeScript("arguments[0].style.visibility = 'visible'; return arguments[0];", signup_email);

//Now if it is visible then goto set value
signup_email.sendKeys("abc@xyz.com");

已编辑 :- 正如我所见,此元素适用于 angularjs,请尝试使用 angularjs 设置值,如下所示使用 JavascriptExecutor

WebElement signup_email = wait.until(ExpectedConditions.presenceOfElementLocated(By.name("email")));

((JavascriptExecutor).executeScript("angular.element(arguments[0]).scope().email = arguments[1]", signup_email, "abc@xyz.com");

希望对您有所帮助...:)

【讨论】:

我得到一个异常 org.openqa.selenium.TimeoutException: 10 秒后超时等待 By.name 定位的元素的可见性:电子邮件 @Lucy 尝试然后使用ExpectedConditions.presenceOfElementLocated..查看更新的答案.. 现在得到“ElementNotVisibleException” @Lucy 好的,然后尝试使用JavascriptExecutor 设置值,请参阅编辑后的答案..希望它有效..:) @SaurabhGaur 现在它正在工作..实际上我正在动态加载另一个具有相同名称的 html 页面。当我将名称更改为“email_1”时,代码正常工作..

以上是关于无法使用 Selenium WebDriver 在文本框中输入值的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Selenium Webdriver 中设置 cookie

无法使用 selenium webdriver 在 google colab 中打开网站

无法使用Selenium和Java 11导入org.openqa.selenium.WebDriver

Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能

无法使用 Selenium WebDriver 在文本框中输入值

无法使用selenium webdriver在表中找到元素