【问题标题】:I am getting error for isDisplayed method?isDisplayed 方法出现错误?
【发布时间】:2020-05-30 05:35:57
【问题描述】:

if (driver.findElement(By.id(id)).isDisplayed()) {

}

元素不可用时总是执行失败?

环境:

Appium 1.15.1

java客户端7.3.0

硒-java 3.141.59

错误日志:

Android Loding 问题页面

org.openqa.selenium.NoSuchElementException: Can't locate an element by this strategy: By.chained({By.AccessibilityId: OK}) 在 io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:126) 在 io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:59) 在 io.appium.java_client.ios.IOSElement$$EnhancerByCGLIB$$d311658.isDisplayed() 在 在✽。并验证侧面菜单列表正在导航到带有 OnBoared User 的相应屏幕(:12) 原因:org.openqa.selenium.TimeoutException:预期条件失败:等待 io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction@66ba7e45(尝试 1 秒,间隔 500 毫秒) 在 org.openqa.selenium.support.ui.FluentWait.timeoutException(FluentWait.java:304) 在 org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:272) 在 io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:99) 在 io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:119) 在 io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:59) 在 io.appium.java_client.ios.IOSElement$$EnhancerByCGLIB$$d311658.isDisplayed() 在 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 cucumber.runtime.Utils$1.call(Utils.java:40) 在 cucumber.runtime.Timeout.timeout(Timeout.java:16) 在 cucumber.runtime.Utils.invoke(Utils.java:34) 在 cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:38) 在 cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:37) 在 cucumber.runtime.Runtime.runStep(Runtime.java:300) 在 cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44) 在 cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39) 在 cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44) 在 cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.java:102) 在 cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63) 在 cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70) 在 cucumber.api.junit.Cucumber.runChild(Cucumber.java:95) 在 cucumber.api.junit.Cucumber.runChild(Cucumber.java:38) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 在 org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 cucumber.api.junit.Cucumber.run(Cucumber.java:100) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:115) 在 org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:39) 在 java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) 在 java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 在 java.util.Iterator.forEachRemaining(Iterator.java:116) 在 java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) 在 java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 在 java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 在 java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) 在 java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) 在 java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) 在 org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:79) 在 org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:70) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220) 在 org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188) 在 org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) 在 org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209) 原因:org.openqa.selenium.NoSuchElementException: 无法使用 By.chained({By.AccessibilityId: OK}) 定位元素 有关此错误的文档,请访问:https://www.seleniumhq.org/exceptions/no_such_element.html 构建信息:版本:'3.141.59',修订:'e82be7d358',时间:'2018-11-14T08:17:03' 系统信息:主机:'Elites-MacBook-Pro-4.local',ip:'fe80:0:0:0:1c56:6e8a:fceb:a653%en0',os.name:'Mac OS X',os .arch:'x86_64',os.version:'10.15.3',java.version:'1.8.0_201' 驱动信息:driver.version:IOSDriver 在 io.appium.java_client.pagefactory.bys.builder.ByChained.findElement(ByChained.java:74) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315) 在 io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:57) 在 io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1) 在 io.appium.java_client.ios.IOSDriver.findElement(IOSDriver.java:1) 在 io.appium.java_client.pagefactory.bys.ContentMappedBy.findElement(ContentMappedBy.java:50) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315) 在 io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:57) 在 io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1) 在 io.appium.java_client.ios.IOSDriver.findElement(IOSDriver.java:1) 在 io.appium.java_client.pagefactory.AppiumElementLocator.lambda$0(AppiumElementLocator.java:120) 在 io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction.apply(AppiumElementLocator.java:172) 在 io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction.apply(AppiumElementLocator.java:1) 在 org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:249) ... 67 更多

【问题讨论】:

  • 元素在屏幕上?在 appium 中,如果元素不是屏幕,它将返回 false
  • 那是警报 Ok 弹出窗口。不显示
  • 基本上你希望它应该返回 true 或 false 但它不应该失败?

标签: selenium appium nosuchelementexception


【解决方案1】:

如果你想验证元素是否显示在页面上,你可以试试这个:

List<WebElement> ele = driver.findElements(By.id(id));

这将返回与您提供的 id 匹配的元素列表。如果 List 大小大于 0,则表示该元素存在于页面上。

【讨论】:

    【解决方案2】:

    你可以为移动元素的visibility写一个custom函数。

    public boolean checkMobileElementExist(By by)  {
            boolean objectExist = false;
            try {
                objectExist = element.findElement(by).isDisplayed();
    
            } catch (NoSuchElementException e) {
                return false;
            }
    
            return objectExist;
        }
    

    现在你可以在你的代码中使用这个函数

    if (checkMobileElementExist(By.id(id))) {
    }
    

    【讨论】:

      【解决方案3】:

      您可以在此处创建自定义 isDisplayed 方法,并进行一些显式等待。像这样的

      protected boolean isDisplayed(WebElement id, long timeOutInSeconds) {
              try {
                  WebDriverWait wait = new WebDriverWait(DriverManager.getDriver(), timeOutInSeconds);
                  wait.until(ExpectedConditions.visibilityOf(id));
              } catch (TimeoutException | NoSuchElementException ex) {
                  return false;
              }
              return true;
          }
      

      然后像这样应用到您的元素:

      if (!isDisplayed(ELEMENTNAME, 10)) {
                  Assert.fail("");
              } else {
                  Log.info("");
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多