如何解决.sendKeys() 方法在我尝试输入值时不起作用
我想将值发送到“搜索”输入,但 sendKeys() 方法不起作用。我手动检查了“xpath”路径,在输入值之前添加了 clear() 方法,但没有任何改变。还添加了 webdriverwait。 有方法:
public Seminar searchSeminarByName(String seminarName){
WebElement searchInp = driver.findElement(searchInput);
if (searchInp == null){
log.error("Can not find element by {}",searchInput);
}else{
log.info("Founded element ex {}",searchInp);
log.info("Founded element {}",searchInp.getTagName());
}
webdriverwait wait = new webdriverwait(driver,30);
wait.until(ExpectedConditions.elementToBeClickable(searchInp));
searchInp.click();
searchInp.sendKeys(seminarName);
wait.until(ExpectedConditions.textToBePresentInElement(searchInp,seminarName));
searchInp.sendKeys(Keys.ENTER);
WebElement seminarId = driver.findElement(By.xpath("//td[1]"));
WebElement seminarNametd = driver.findElement(By.xpath("//td[2]"));
WebElement seminarStatus =driver.findElement(By.xpath("//td[4]"));
return new Seminar(Long.parseLong(seminarId.getText()),seminarNametd.getText(),seminarStatus.getText());
}
此方法在“搜索”输入上发送值并从页面返回找到的信息。 使用方法检查另一个类中的信息:
@Test
public void searchFieldCheck(){
Seminar seminar = seminarPage.searchSeminarByName(groupName);
Assert.assertEquals(groupName,seminar.getName());
}
运行测试的日志:
Starting ChromeDriver 87.0.4280.20 (c99e81631faa0b2a448e658c0dbd8311fb04ddbd-refs/branch-heads/4280@{#355}) on port 11594
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
[1612355832.736][WARNING]: This version of ChromeDriver has not been tested with Chrome version 88.
февр. 03,2021 2:37:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
2021-02-03 14:37:22.387 [main] INFO SeminarPage - Founded element ex [[ChromeDriver: chrome on WINDOWS (3e6dd669a7b7ad62f24b6dd150da861b)] -> xpath: //input/parent::div/*]
2021-02-03 14:37:22.394 [main] INFO SeminarPage - Founded element input
org.openqa.selenium.TimeoutException: Expected condition Failed: waiting for element ([[ChromeDriver: chrome on WINDOWS (3e6dd669a7b7ad62f24b6dd150da861b)] -> xpath: //input/parent::div/*]) to be selected (tried for 30 second(s) with 500 milliseconds interval)
Build info: version: '3.141.59',revision: 'e82be7d358',time: '2018-11-14T08:17:03'
System info: host: 'DESKTOP-PS8FAB8',ip: '172.18.76.97',os.name: 'Windows 10',os.arch: 'amd64',os.version: '10.0',java.version: '14.0.2'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false,browserName: chrome,browserVersion: 88.0.4324.104,chrome: {chromedriverVersion: 87.0.4280.20 (c99e81631faa0...,userDataDir: C:\Users\Frederik\AppData\L...},goog:chromeOptions: {debuggerAddress: localhost:41163},javascriptEnabled: true,networkConnectionEnabled: false,pageLoadStrategy: normal,platform: WINDOWS,platformName: WINDOWS,proxy: Proxy(),setwindowRect: true,strictFileInteractability: false,timeouts: {implicit: 0,pageLoad: 300000,script: 30000},unhandledPromptBehavior: dismiss and notify,webauthn:virtualAuthenticators: true}
Session ID: 3e6dd669a7b7ad62f24b6dd150da861b
at org.openqa.selenium.support.ui.webdriverwait.timeoutException(webdriverwait.java:95)
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:272)
at SeminarPage.searchSeminarByName(SeminarPage.java:48)
at SeminarPageTest.searchFieldCheck(SeminarPageTest.java:34)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runchildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
更新
问题是Selenium的工作速度太快添加到代码Thread.sleep(500); 代码(使用 lombok):
@SneakyThrows
public Seminar searchSeminarByName(String seminarName){
WebElement searchInp = driver.findElement(searchInput);
if (searchInp == null){
log.error("Can not find element by {}",searchInp.getTagName());
}
//webdriverwait wait = new webdriverwait(driver,30);
//wait.until(ExpectedConditions.elementToBeClickable(searchInp));
searchInp.click();
Thread.sleep(500); //required waite,because "sendKeys" is ignored for some time after render.
//wait.until(ExpectedConditions.elementToBeSelected(searchInp));
searchInp.sendKeys(seminarName);
//wait.until(ExpectedConditions.textToBePresentInElement(searchInp,seminarName));
Thread.sleep(500);
searchInp.sendKeys(Keys.ENTER);
Thread.sleep(700);
WebElement seminarId = driver.findElement(By.xpath("//td[1]"));
WebElement seminarNametd = driver.findElement(By.xpath("//td[2]"));
WebElement seminarStatus =driver.findElement(By.xpath("//td[4]"));
return new Seminar(Long.parseLong(seminarId.getText()),seminarStatus.getText());
}
测试通过:
Starting ChromeDriver 88.0.4324.96 (68dba2d8a0b149a1d3afac56fa74648032bcf46b-refs/branch-heads/4324@{#1784}) on port 19322
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
февр. 03,2021 9:27:01 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
2021-02-03 21:27:06.999 [main] INFO SeminarPage - Founded element ex [[ChromeDriver: chrome on WINDOWS (50d08a5eaebefd27100eb7990b7149f8)] -> xpath: //input/parent::div/*]
2021-02-03 21:27:07.006 [main] INFO SeminarPage - Founded element input
解决方法
问题出在这一行:
wait.until(ExpectedConditions.elementToBeClickable(searchInp));
根据您的日志,searchInp
不是可点击的元素。检查您的页面,并可能将此预期条件更改为“元素存在”。例如:
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.presenceOfElementLocated(locator));
其中 locator
是 org.openqa.selenium.By
类中实施的多种本地化策略之一:
className(String className)
cssSelector(String selectorName)
id(String id)
linkText(String linkText)
name(String name)
partialLinkText(String partialLinkText)
tagName(String tagName)
xpath(String xpath)
我认为最强大的是 XPath。这也是最复杂的。对于您的情况,您可以执行类似 By locator = By.xpath("some xpath string here");
的操作,然后将该定位器传递给 ExpectedConditions
。
我还建议您阅读网络驱动程序 click
方法,以便您可以更好地了解此函数在什么条件下以及哪些类型的元素将起作用。
更新:
如果不熟悉页面结构,很难弄清楚为什么 sendKeys
不起作用。一个潜在的问题是您需要向其发送击键的字段位于 iframe 中。如果是这种情况,您必须告诉 Web 驱动程序切换到 iframe,然后将它们的击键发送到该字段。完成后,您需要从 iframe 切换回主窗口(框架)。在网络上快速搜索“selenium switch to iframe”应该会为您指明正确的方向如果这是问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。