java - 硒有时找不到元素
问题描述
我使用 Selenium 与 Jira 交互。我的应用程序从 Google 表格中读取时间日志并将它们插入到 Jira 时间记录器(非标准 Jira 插件)中。
问题是当我尝试单击 TimeLog 插件时,Selenium 在舞台上不时返回以下异常(其他阶段正常工作)
Exception in thread "main" org.openqa.selenium.TimeoutException: Expected condition failed: waiting for visibility of element located by By.xpath: //div[@class='sc-bvODop kOWqZw' and @xpath='1'] (tried for 40 second(s) with 500 milliseconds interval)
at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:95)
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:272)
at com.fox.jiratimelog.selenium.SeleniumOperator.openTimeLog(SeleniumOperator.java:143)
at com.fox.jiratimelog.selenium.SeleniumOperator.inputNewLogs(SeleniumOperator.java:60)
at com.fox.jiratimelog.selenium.SeleniumOperator.runSelenium(SeleniumOperator.java:50)
at com.fox.jiratimelog.JiraTimeLogApplication.main(JiraTimeLogApplication.java:24)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class='sc-bvODop kOWqZw' and @xpath='1']"}
(Session info: chrome=86.0.4240.75)
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'DESKTOP-OFG72V5', ip: '192.168.0.105', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '14.0.1'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 86.0.4240.75, chrome: {chromedriverVersion: 85.0.4183.87 (cd6713ebf92fa..., userDataDir: C:\Users\Max\AppData\Local\...}, goog:chromeOptions: {debuggerAddress: localhost:49319}, 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: e3a81681e9e6873351bab1211c3386e7
*** Element info: {Using=xpath, value=//div[@class='sc-bvODop kOWqZw' and @xpath='1']}
at jdk.internal.reflect.GeneratedConstructorAccessor21.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:205)
at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:201)
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:249)
... 4 more
我可以在前 10-15 次运行应用程序并且它工作正常,然后我看到了这样的异常。当我手动关闭打开的驱动程序(通过任务管理器)并清理 Windows 和 Chrome 临时文件时,它可能会给我更多次运行应用程序。然后我收到同样的异常。
我尝试使用不同的drivers
(MS Edge),检查相对xPath
,使用不同的waiting
策略
public void runSelenium(WebDriver driver) throws InterruptedException, IOException, GeneralSecurityException {
if (!driver.getTitle().equals("Google")) {
driver.manage().window().maximize();
}
enterLogin(driver);
Thread.sleep(2000);
enterPassword(driver);
Thread.sleep(7000);
openProject(driver);
Thread.sleep(3000);
openIssue(driver);
Thread.sleep(5000);
// stages above work properly
if (isNewLogsToInput()) {
inputNewLogs(driver);
}
}
private void inputNewLogs(WebDriver driver) throws InterruptedException, IOException, GeneralSecurityException {
int entriesNumber = reader.getEntriesNumberFromSheets();
int numberOfNewLogs = entriesNumber - logs.getTimeLogsQuantity();
int startPosition = entriesNumber - numberOfNewLogs;
for (int i = startPosition; i < entriesNumber; i++) {
openTimeLog(driver); // HERE I HAVE A PROBLEM
Thread.sleep(3000);
inputTimeSpent(driver, i);
Thread.sleep(2000);
inputTimeRemaining(driver, i);
Thread.sleep(2000);
inputDateStarted(driver, i);
Thread.sleep(2000);
inputTimeStarted(driver, i);
Thread.sleep(2000);
inputWorkDescription(driver, i);
Thread.sleep(2000);
saveTime(driver);
}
}
private void openTimeLog(WebDriver driver) {
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement button = wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath("//body/div[13]/div[3]/div[1]/div[3]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/small[1]")));
button.click();
}
<div class="sc-bIZIuE bmcBym" data-test-id="issue.views.issue-base.context.context-items.primary-items">
<div>
<div class="sc-LAuEU kNfSUt"><h2 class="sc-hrBRpH juzrVt">Time tracking</h2></div>
<div class="sc-bvODop kOWqZw">
<div class="RootWrapper-sc-1va80k6-0 fsVJT">
<div style="position: absolute;"><label class="Label__LabelWrapper-sc-17towfw-0 keOXhT">
<div class="Label__LabelInner-sc-17towfw-1 jbyPaz"><span>Time tracking</span></div>
</label></div>
<div class="ContentWrapper-kdagst-0 fPLsyX">
<div class="FieldBaseWrapper-sc-14kmybr-0 cspqsP">
<div class="Content__ContentWrapper-ve26fj-2 feWTNh">
<div class="Content__ChildWrapper-ve26fj-0 ilJUcG">
<div class="Content-ve26fj-1 llCsQv">
<div class="ReadViewContentWrapper-xymwx5-0 kLiHRY">
<div class="sc-eAyhxF hdkDWI">
<div class="sc-kbdWBx dpBQSe"><span class="sc-kGXeez gTVGyF"
role="presentation"><object
data="https://jira-frontend-static.prod.public.atl-paas.net/assets/stopwatch-glyph.abbc4afde0b6bdac7465517877d67af5.8.svg"
width="24" height="24" type="image/svg+xml"></object></span></div>
<div class="sc-eVrGFk bqZIdq">
<div class="sc-fdqjUm jBnpdo">
<div class="sc-cLmFfZ cjohbD" color="#0052CC"
width="22.669735327963174%"></div>
<div class="sc-cLmFfZ csMpYM" color="#FFAB00" width="0"></div>
</div>
<small class="sc-iNovjJ gmkLRu" xpath="1"><span
class="sc-kyCyAI gZEfLW"><span><span class="sc-dchYKM ENMBd">2d 25m</span> logged</span></span><span
class="sc-fEVUGC eXwoSi"><span><span class="sc-dchYKM ENMBd">1w 2d</span> remaining</span></span></small>
</div>
</div>
<button class="EditButton-sc-1v6bv8a-0 doKTJP" aria-label="Edit Time tracking"
type="button"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<div>
<div class="sc-LAuEU kNfSUt"><h2 class="sc-hrBRpH juzrVt">Assignee</h2></div>
<div class="sc-eZXMBi iWQVSp" data-test-id="issue.views.field.user.assignee">
<div class="RootWrapper-sc-1va80k6-0 fsVJT">
<div style="position: absolute;"><label class="Label__LabelWrapper-sc-17towfw-0 keOXhT">
<div class="Label__LabelInner-sc-17towfw-1 jbyPaz"><span>Assignee</span></div>
</label></div>
<div class="ContentWrapper-kdagst-0 fPLsyX">
<div class="FieldBaseWrapper-sc-14kmybr-0 cspqsP">
<div class="Content__ContentWrapper-ve26fj-2 feWTNh">
<div class="Content__ChildWrapper-ve26fj-0 ilJUcG">
<div class="Content-ve26fj-1 llCsQv">
<div class="ReadViewContentWrapper-xymwx5-0 kLiHRY">
<div class="sc-iBlNuT fGlWRy">
<div class="sc-iXKTDd ferkkY">
<div data-test-id="profilecard-next.ui.profilecard.profilecard-trigger">
<div class="sc-kiXyGy iYsZzI">
<div class="sc-ekQYnd gFYdNG">
<div style="display: inline-block; position: relative; outline: 0px;">
<span class="css-1c24z73"><span class="css-zk1cl3"
role="img"
aria-label=""></span></span>
</div>
</div>
<div class="SingleLineTextInput__ReadView-sc-4hfvq0-0 epXzqq">
Test test
</div>
</div>
</div>
</div>
</div>
<button class="EditButton-sc-1v6bv8a-0 doKTJP" aria-label="Edit Assignee"
type="button"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<div class="sc-LAuEU kNfSUt"><h2 class="sc-hrBRpH juzrVt">Labels</h2></div>
<div>
<div class="sc-bvODop kOWqZw">
<div class="RootWrapper-sc-1va80k6-0 fsVJT">
<div style="position: absolute;"><label class="Label__LabelWrapper-sc-17towfw-0 keOXhT">
<div class="Label__LabelInner-sc-17towfw-1 jbyPaz"><span>Labels</span></div>
</label></div>
<div class="ContentWrapper-kdagst-0 fPLsyX">
<div class="FieldBaseWrapper-sc-14kmybr-0 cspqsP">
<div class="Content__ContentWrapper-ve26fj-2 feWTNh">
<div class="Content__ChildWrapper-ve26fj-0 ilJUcG">
<div class="Content-ve26fj-1 llCsQv">
<div class="ReadViewContentWrapper-xymwx5-0 kLiHRY"><span
class="sc-esExBO gIsNhp">None</span>
<button class="EditButton-sc-1v6bv8a-0 doKTJP" aria-label="Edit Labels"
type="button"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<div class="sc-LAuEU kNfSUt"><h2 class="sc-hrBRpH juzrVt">Sprint</h2></div>
<div>
<div class="sc-bvODop kOWqZw">
<div class="RootWrapper-sc-1va80k6-0 fsVJT">
<div style="position: absolute;"><label class="Label__LabelWrapper-sc-17towfw-0 keOXhT">
<div class="Label__LabelInner-sc-17towfw-1 jbyPaz"><span>Sprint</span></div>
</label></div>
<div class="ContentWrapper-kdagst-0 fPLsyX">
<div class="FieldBaseWrapper-sc-14kmybr-0 cspqsP">
<div class="Content__ContentWrapper-ve26fj-2 feWTNh">
<div class="Content__ChildWrapper-ve26fj-0 ilJUcG">
<div class="Content-ve26fj-1 llCsQv">
<div class="ReadViewContentWrapper-xymwx5-0 kLiHRY">
<div class="sc-hQDGvh fijXMI">
<div class="sc-eYdvao dhbZhl"><a>FOX Sprint 1</a></div>
</div>
<button class="EditButton-sc-1v6bv8a-0 doKTJP" aria-label="Edit Sprint"
type="button"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sc-eePzDA jCyCpj">
<div class="sc-LAuEU kNfSUt"><h2 class="sc-hrBRpH juzrVt">Story point estimate</h2></div>
<div>
<div class="RootWrapper-sc-1va80k6-0 fsVJT">
<div style="position: absolute;"><label class="Label__LabelWrapper-sc-17towfw-0 keOXhT">
<div class="Label__LabelInner-sc-17towfw-1 jbyPaz"><span>Story point estimate</span></div>
</label></div>
<div class="ContentWrapper-kdagst-0 fPLsyX">
<div class="FieldBaseWrapper-sc-14kmybr-0 cspqsP">
<div class="Content__ContentWrapper-ve26fj-2 feWTNh">
<div class="Content__ChildWrapper-ve26fj-0 ilJUcG">
<div class="Content-ve26fj-1 llCsQv">
<div class="ReadViewContentWrapper-xymwx5-0 kLiHRY"><span
class="sc-hmzhuo igqoCl">8</span>
<button class="EditButton-sc-1v6bv8a-0 doKTJP" aria-label="Edit"
type="button"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<div class="sc-LAuEU kNfSUt"><h2 class="sc-hrBRpH juzrVt">Reporter</h2></div>
<div class="sc-eZXMBi iWQVSp" data-test-id="issue.views.field.user.reporter">
<div class="RootWrapper-sc-1va80k6-0 fsVJT">
<div style="position: absolute;"><label class="Label__LabelWrapper-sc-17towfw-0 keOXhT">
<div class="Label__LabelInner-sc-17towfw-1 jbyPaz"><span>Reporter</span></div>
</label></div>
<div class="ContentWrapper-kdagst-0 fPLsyX">
<div class="FieldBaseWrapper-sc-14kmybr-0 cspqsP">
<div class="Content__ContentWrapper-ve26fj-2 feWTNh">
<div class="Content__ChildWrapper-ve26fj-0 ilJUcG">
<div class="Content-ve26fj-1 llCsQv">
<div class="ReadViewContentWrapper-xymwx5-0 kLiHRY">
<div class="sc-iBlNuT fGlWRy">
<div class="sc-iXKTDd ferkkY">
<div data-test-id="profilecard-next.ui.profilecard.profilecard-trigger">
<div class="sc-kiXyGy iYsZzI">
<div class="sc-ekQYnd gFYdNG">
<div style="display: inline-block; position: relative; outline: 0px;">
<span class="css-1c24z73"><span class="css-zk1cl3"
role="img"
aria-label=""></span></span>
</div>
</div>
<div class="SingleLineTextInput__ReadView-sc-4hfvq0-0 epXzqq">
Test test
</div>
</div>
</div>
</div>
</div>
<button class="EditButton-sc-1v6bv8a-0 doKTJP" aria-label="Edit Reporter"
type="button"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<div id="releases-panel-container" class="sc-jHsedM dDOmWr" data-test-id="development.releases-glance.actions">
<div class="sc-jeZOwl eFGvoQ"><h2 class="sc-buBCPq fOTSoR">Releases</h2></div>
<div class="sc-cPwpjd egqpOy"></div>
</div>
</div>
</div>
我无法理解我做错了什么......
解决方案
你至少做错了三件事:
- 使用固定睡眠。
这不是一个好的做法,因为在很长一段时间内,您的测试没有做任何事情。改用更灵活的睡眠。
- 使用脆弱的 xpath。
//body/div[13]/div[3]/div[1]/div[3]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/small[1]
很容易折断。如果您可以提供页面的 HTML,我们可以尝试找到更好的定位器。
- 可能是短暂的等待。
这WebDriverWait wait = new WebDriverWait(driver, 20);
是比使用更好的方法Thread.sleep()
。但是,20 秒可能很短,例如取决于网络速度。尝试使用更长的超时时间。
编辑:
通过使用 CSS 选择器而不是 XPATH 选择器解决了这个问题:
By.cssSelector("div[class*='Content__ChildWrapper'] small")
推荐阅读
- php - 如何将变量从函数传递到 PHP / Laravel 中的条带化 webhook 函数?
- javascript - 使用ajax添加数据后dataTable的行消失
- pandas - 如何从看起来像 Pandas 中的字典的列中提取数据?
- c - 一起使用二进制信号量和互斥量
- facebook-graph-api - 获取 facebook 帐户账单信息的 API
- ios - 为什么网络库无法检测到互联网何时在 Swift Ios 中重新连接
- node.js - nodejs spotify web api无法使用access_token进行身份验证
- dataset - 如何识别表示整个数据集的数据集子集?
- c - 文件溢出到分配的内存 C
- android - 如何删除微调器中的右侧间距或填充?