微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.sendKeys() 方法在我尝试输入值时不起作用

如何解决.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));

其中 locatororg.openqa.selenium.By 类中实施的多种本地化策略之一:

  1. className(String className)
  2. cssSelector(String selectorName)
  3. id(String id)
  4. linkText(String linkText)
  5. name(String name)
  6. partialLinkText(String partialLinkText)
  7. tagName(String tagName)
  8. 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 举报,一经查实,本站将立刻删除。