首页 > 解决方案 > 硒有时找不到元素

问题描述

我使用 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>

我无法理解我做错了什么......

标签: javaselenium

解决方案


你至少做错了三件事:

  1. 使用固定睡眠。

这不是一个好的做法,因为在很长一段时间内,您的测试没有做任何事情。改用更灵活的睡眠。

  1. 使用脆弱的 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,我们可以尝试找到更好的定位器。

  1. 可能是短暂的等待。

WebDriverWait wait = new WebDriverWait(driver, 20);是比使用更好的方法Thread.sleep()。但是,20 秒可能很短,例如取决于网络速度。尝试使用更长的超时时间。

编辑:

通过使用 CSS 选择器而不是 XPATH 选择器解决了这个问题:

By.cssSelector("div[class*='Content__ChildWrapper'] small")

推荐阅读