1

セレンを使用して、動的に生成されたテーブルを読み込もうとしています。(findElementメソッドを使用して)正しい要素に到達しましたがgetText()、それらを使用しても何も返されません。

おそらく、 「テキスト」を返すときに引用符を探し、タグgetText()の間に何も見つからないためです。<td>いくつかの提案は xpaths を使用することでしたが、テーブルが動的に生成されるため、必要な値の場所も変更されます。

3つのデータポイントを取得しようとしているテーブルは次のとおりです。

<table cellpadding="0" cellspacing="0" class="fleetinfo">
        <tbody><tr>
            <th colspan="2">Schepen:</th>
        </tr>
                <tr>
            <td>Groot vrachtschip:</td>
            <td class="value">
                            40                        </td>
        </tr>
                <tr>
            <td colspan="2">&nbsp;</td>
        </tr>
        <tr>
            <th colspan="2">Lading:</th>
        </tr>
        <tr>
            <td>Metaal:</td>
            <td class="value">
                536.062            </td>
        </tr>
        <tr>
            <td>Kristal:</td>
            <td class="value">
                289.008            </td>
        </tr>
        <tr>
            <td>Deuterium:</td>
            <td class="value">
                92.750            </td>
        </tr>
    </tbody></table>

私が興味を持っているのは<td class="value">タグ内のものですが、前に言ったように、getText()それらを使用するとnullが返されます。

これらの値にアクセスする方法について何か考えはありますか?

編集:これが私が今やっている方法です

private int getMetalFromFleet(WebElement fleet)
    {
        int ret=0;

        WebElement streak = fleet.findElement(By.className("starStreak"));
        List<WebElement>fleetDetails = streak.findElements(By.tagName("tr"));

        for(WebElement detail : fleetDetails)
        {
            List<WebElement> tabel = detail.findElements(By.tagName("td")); 

            if(tabel.size() != 2)
                continue;

            if(tabel.get(0).getText().equalsIgnoreCase("metaal:"))
            {
                ret = Integer.parseInt(tabel.get(1).getText());
                break;
            }
        }

        return ret;
    }

編集:ここに関連するHTMLのビットがあります

<div id="fleet9965869" class="fleetDetails detailsOpened" data-mission-type="4" data-return-flight="false" data-arrival-time="1378241688">
        <span class="timer tooltip" title="03.09.2013 22:54:48" id="timer_9965869">58m 48s</span>
        <span class="absTime">22:54:48 Klok</span>
        <span class="mission neutral textBeefy">Plaatsen</span>
        <span class="allianceName"></span>
        <span class="originData">
            <span class="originCoords tooltip" title="killernerd"><a href="http://uni107.ogame.nl/game/index.php?page=galaxy&amp;galaxy=5&amp;system=213">[5:213:8]</a></span>
            <span class="originPlanet">
                <figure class="planetIcon planet tooltip js_hideTipOnMobile" title="planeet"></figure>k7                            </span>
        </span>
        <span class="marker01"></span>        
        <span class="marker02"></span>
        <span class="fleetDetailButton">
            <a href="#bl9965869" rel="bl9965869" title="Vlootdetails" class="tooltipRel tooltipClose fleet_icon_forward">
            </a>
        </span>
                <span class="reversal reversal_time" ref="9965869">
                <a class="icon_link tooltipHTML" href="http://uni107.ogame.nl/game/index.php?page=movement&amp;return=9965869" title="Roep terug:| 04.09.2013&lt;br&gt;01:54:05">
                    <img src="http://gf2.geo.gfsrv.net/cdna2/89624964d4b06356842188dba05b1b.gif" height="16" width="16">
                </a>
            </span>
            <span class="starStreak">
            <div style="position: relative;">
                <div class="origin fixed">
                    <img class="tooltipHTML" height="30" width="30" src="http://gf1.geo.gfsrv.net/cdnf0/af41c52dc08208b4463f4a4608e88c.png" title="" alt="">
                </div>

                <div class="route fixed">

                    <a href="#bl9965869" rel="bl9965869" title="Vlootdetails" class="tooltipRel tooltipClose basic2 fleet_icon_forward" id="route_9965869" style="margin-left: 220px;"></a>

                    <div style="display:none;" id="bl9965869">
                        <div class="htmlTooltip">
    <h1>Vlootdetails:</h1>
    <div class="splitLine"></div>
    <table cellpadding="0" cellspacing="0" class="fleetinfo">
        <tbody><tr>
            <th colspan="2">Schepen:</th>
        </tr>
                <tr>
            <td>Groot vrachtschip:</td>
            <td class="value">
                            960                        </td>
        </tr>
                <tr>
            <td colspan="2">&nbsp;</td>
        </tr>
        <tr>
            <th colspan="2">Lading:</th>
        </tr>
        <tr>
            <td>Metaal:</td>
            <td class="value">
                8.173.484            </td>
        </tr>
        <tr>
            <td>Kristal:</td>
            <td class="value">
                6.325.966            </td>
        </tr>
        <tr>
            <td>Deuterium:</td>
            <td class="value">
                7.474.821            </td>
        </tr>
    </tbody></table>
</div>                    </div>

                </div>

                <div class="destination fixed">
                    <img class="tooltipHTML" height="30" width="30" src="http://gf2.geo.gfsrv.net/cdnaa/af0b356fdbecc1cfc47130e990fa66.png" title="Aankomsttijd:| 03.09.2013&lt;br&gt;22:54:48" alt="">
                </div>
            </div>
        </span><!-- Starstreak -->
        <span class="destinationData">
                        <span class="destinationPlanet">
                <span>
                    <figure class="planetIcon planet tooltip js_hideTipOnMobile" title="planeet"></figure>Hoelbrak                                    </span>
            </span>

                            <span class="destinationCoords tooltip" title="killernerd"><a href="http://uni107.ogame.nl/game/index.php?page=galaxy&amp;galaxy=1&amp;system=2">[1:2:6]</a></span>

        </span>
        <span class="nextTimer tooltip" title="04.09.2013 03:52:31" id="timerNext_9965869">5u 56m 31s</span>
        <span class="nextabsTime">03:52:31 Klok</span>
        <span class="nextMission friendly textBeefy">Keer terug</span>
        <span class="openDetails">
            <a href="javascript:void(0);" class="openCloseDetails" data-mission-id="9965869" data-end-time="1378241688">
                <img src="http://gf3.geo.gfsrv.net/cdnb6/577565fadab7780b0997a76d0dca9b.gif" height="16" width="16">
            </a>
        </span>
    </div>

必要な値は、「Metaal」、「kristal」、および「deuterium」の下の数値です。

4

3 に答える 3

2

たくさんのプログラミングサイトを掘り下げた後、ある種の答えを見つけました。どうやら、このようにフラグが設定されているアイテムは、style="display:none";セレンによって「隠されている」と見なされます。

残念ながら、これは機能であり、ある種のバグではありません。セレンは「使用 r をエミュレートしようとする」ため、明示的に表示されていない情報を隠します。

ユーザーはそれを見ることができないので、セレンもできません」は彼らの思考の進歩です。

これがソースです。

残念ながら、これは私の問題を解決しません。ただし、これを回避することはできます。調査結果を報告します。

編集: HtmlUnitDriver が FirefoxDriver とどのように異なるかは面白いです。HtmlUnitDriver で動作するものは FirefoxDriver では動作せず、その逆も同様です。

EDIT-2 : 解決策が見つかりました! ついに。

セレンを使用JavascriptExecutorすると、見つかった要素から次のように innerHTML を直接取得できます。

By identifier = By.xpath("*[contains(@class,'starStreak')]//td[contains(text(),'Metaal:')]/following-sibling::td[contains(@class,'value')]");
    String script = "return arguments[0].innerHTML";
    String outcome = (String) ((JavascriptExecutor) driver).executeScript(script, fleet.findElement(identifier));

とはいえ、ただ使えないのはまだ地獄のように迷惑getText()です。少なくともオプションであるべきです。

于 2013-09-04T17:01:38.540 に答える
2

このシナリオでは、タグ名に頼るのではなく、xpath を使用することをお勧めします。

private int getMetalFromFleet(WebElement fleet)
    {
        By identifier = By.xpath("td[contains(text(),'Metaal')]/following-sibling::td[contains(@class,'value')]");

        return Integer.parseInt(fleet.findElement(identifier).getText());
    }

明らかに、そこにエラー処理が必要になりますが、うまくいけば、これらのループが常に必要であるとは限らず、Xpath が常に一部の人によって作成されたボギーマンであるとは限らないという考えが得られることを願っています。

編集

誰かが混乱した場合に備えて、セレクターが WebDriver オブジェクトではなく WebElement で実行される場合、XPath の先頭にスラッシュがなくても問題ありません。

このセレクターが WebDriver オブジェクトで使用された場合、先頭に 2 つのスラッシュを追加する必要があります。

もう一度編集してください!

Xpath には微調整が必​​要かもしれませんが、アプローチのアイデアを得る必要があります。HTML に「StarStreek」が表示されませんが、コードに含まれていたので、xpath に追加しました。

于 2013-09-02T23:00:13.437 に答える
0

同様の問題が発生しました-値を指定したテーブルの行をクリックしたいです。解決策(idはクラス名などに変更できます):

driver.findElement(By.xpath("//table[@id='<yourTableId>']//tr//td[contains(text(),'"+<givenValue>+"')]")).click();
于 2014-04-18T11:24:49.737 に答える