【问题标题】:How can I find a special element on a page?如何在页面上找到特殊元素?
【发布时间】:2016-10-18 13:17:48
【问题描述】:

我开始使用硒。我打开网址并输入我的用户名和密码:Tribal Wars 2。问题是到达这个按钮点击:

<a href="#" class="btn-orange btn-border small-icon" ng-click="selectCharacter(w.charId, w.id, w.loginDisabled)" tooltip="" tooltip-if="w.loginDisabled" tooltip-content="Diese Welt wurde geschlossen." ng-class="{'btn-grey': w.loginDisabled}" <span class="icon" <span class="icon-inner character" ng-class="{ 'character': playerId === w.ownerId, 'coop': playerId !== w.ownerId, 'locked': w.loginDisabled }"</span </span <span class="wrapper align-left" <span class="text character ng-binding"Rammboss</span <span class="text world ng-binding"Leeds Castle</span </span </a

Java 代码:

driver.findElement(By.xpath("//*[@id=\"wrapper\"]/div[2]/div[3]/div/div[ 1]/div[3]/div[ 1]/ul/li/a")).click();

错误信息:

在端口 20436 上启动 ChromeDriver (v2.9.248315) 线程中的异常 “主” org.openqa.selenium.NoSuchElementException:没有这样的元素
(会话信息:chrome=53.0.2785.143)(驱动程序信息: chromedriver=2.9.248315,平台=Windows NT 6.1 SP1 x86_64)(警告: 服务器没有提供任何堆栈跟踪信息)命令 持续时间或超时:39 毫秒有关此错误的文档, 请访问:seleniumhq.org/exceptions/no_such_element.html 构建信息:版本:'2.43.1',修订: '5163bceef1bc36d43f3dc0b83c88998168a363a0',时间:'2014-09-10 09:43:55' 系统信息:主机:'AGBioSA04',ip:'10.4.1.81',os.name: 'Windows 7',os.arch:'amd64',os.version:'6.1',java.version: '1.8.0_102' 驱动程序信息:org.openqa.selenium.chrome.ChromeDriver 功能 [{applicationCacheEnabled=false, rotatable=false, 铬={userDataDir=C:\Users\Admin\AppData\Local\Temp\scoped_dir4760_1168}, 需要HeapSnapshot=true,databaseEnabled=false,handlesAlerts=true, 版本=53.0.2785.143,平台=XP,browserConnectionEnabled=false, nativeEvents=true,acceptSslCerts=true,locationContextEnabled=true, webStorageEnabled=true,browserName=chrome,takeScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}] 会话 ID: 5f87f399ba0889cb549ffc090b9dffbf 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:352) 在 org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:449) 在 org.openqa.selenium.By$ByXPath.findElement(By.java:357) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:344) 在 com.mysite.selenium.HomePage.fillField(HomePage.java:46) 在 com.mysite.selenium.HomePage.main(HomePage.java:58) 在 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) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

这个游戏是用 PHP 和 Javascript 编写的。 硒可以做到这一点吗?

【问题讨论】:

  • 这些元素并没有太多“特别”之处。我猜你的选择器根本不对。没有更简单、更好的可维护选择器(可能是 css 选择器)吗?您是否尝试过 chrome 中的 xpath 选择器(例如,在元素视图中使用 $x("//*....") 控制台或 ctrl+f)?这里可能出错的另一件事是可能存在时间问题,您可能需要使用隐式/显式超时。

标签: java html selenium


【解决方案1】:

您可能需要在登录后等待您的元素。

 WebDriverWait wait = new WebDriverWait(driver, 10); // Wait for 10 seconds.
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"wrapper\"]/div[2]/div[3]/div/div[ 1]/div[3]/div[ 1]/ul/li/a")));
 WebElement element = driver.findElement(By.xpath("//*[@id=\"wrapper\"]/div[2]/div[3]/div/div[ 1]/div[3]/div[ 1]/ul/li/a"));
 element.click();
  1. 第一行创建 webdriver wait 的实例并使用“10” 等待 10 秒。
  2. 第二行告诉 selenium 等到元素 指定出现。同样,它将等待 10 秒。
  3. 第 3 行找到元素并将其称为“元素”。
  4. 第 4 行点击元素。

希望对您有所帮助。

编辑:以防您在查找 xpath 时遇到问题 - 在铬:

  1. 右键单击网页上的元素,然后单击检查
  2. 元素的 HTML 应突出显示
  3. 右键单击突出显示的部分
  4. 将鼠标悬停在“复制”上
  5. 点击复制 xpath

【讨论】:

  • 是的,你是对的,问题是等待元素,谢谢! :)
  • 没问题,很乐意提供帮助。
【解决方案2】:

在 chrome 控制台上尝试了 xpath,但存在问题。

您可以简单地使用此 xpath 来单击“更多信息”/“Mehr Informationen”按钮

//div[@class='more-info']//a

如果您尝试单击登录按钮,请使用以下 xpath 之一

//button[span[.='Login']]

或者

//button[@class='button-login']

此外,虽然问题中的 xpath 不正确并且不返回任何匹配的节点,但为了将来参考,请不要在 xpath 中指定双引号,即 \"wrapper\"。改用这种方式:

//*[@id='wrapper']

【讨论】:

    【解决方案3】:

    是的,您可以使用 selenium,而不管被测应用程序是用哪种语言开发的。 Selenium 在黑盒级别工作,因此它与 Web 应用程序的代码库没有任何关系。

    关于您的问题,从异常情况来看,元素定位器是错误的,或者您需要等待元素出现。您可以在 firfox 中使用 firbug 和 firepath 来确保您的定位器有效并指向正确的元素。

    这些是您在提供自动化实施时需要注意的常见事项。需要了解 selenium 或 webdriver 是 api,它提供了一种与被测 Web/移动应用程序交互的方法。为了克服所有其他测试需求和一般自动化挑战,您应该创建基础框架,或者开始使用可用的现有框架,例如QMetry Automation Framework

    【讨论】:

      猜你喜欢
      • 2017-08-02
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多