Selenium 对动态生成的字段的帮助

Selenium 对动态生成的字段的帮助,selenium,selenium-webdriver,Selenium,Selenium Webdriver,我还有一个动态问题要问你。我有三个需要输入值的输入字段。这些“dijit\u form\u DateTextBox\u 36”是动态创建的(36是可变的)。代码前面有一个值是唯一的,可以搜索。我知道我需要使用类似于: driver.findElement(By.xpath("//div[contains(., 'QA GM 04012014 1424 Item Name')]/parent::...somepath.sendKeys("..."); 但我对这些东西还是太陌生了,无法理解。如果有

我还有一个动态问题要问你。我有三个需要输入值的输入字段。这些
“dijit\u form\u DateTextBox\u 36”
是动态创建的(36是可变的)。代码前面有一个值是唯一的,可以搜索。我知道我需要使用类似于:

driver.findElement(By.xpath("//div[contains(., 'QA GM 04012014 1424 Item Name')]/parent::...somepath.sendKeys("...");
但我对这些东西还是太陌生了,无法理解。如果有人能帮我做我需要做的事情,以及他们是如何解决的,我会非常感激。我真的很想自己解决这些问题!代码如下。粗体部分是可以搜索的静态文本。粗体和斜体是需要修改的三个控件。注意:
id=“shipDate0\u 0”
也是动态的,它可以是
shipDate0\u 0
shipDate1\u 0
,等等。因此不能输入该项

    <tr class="tableControlHeader twTableHeaderTR"></tr>
    <tr class="tableControlDataRow evenRow twTableTR">
    <td class="twTableTD details" align="center" rowspan="2"></td>
    <td class="twTableTD details" align="center" rowspan="2">
        <p>
            <b>

                QA GM 04012014 1424 Item Name

            </b>
        </p>
        <br></br>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
    </td>
    <td class="twTableTD" align="center" rowspan="2"></td>
    <td class="twTableTD" align="center"></td>
    <td class="twTableTD" align="center"></td>
    <td id="shipDate0_0" class="twTableTD" align="center">
        <div style="padding-right: 20px;">
            <div id="dateWrap-projectedFirstShipDate_0_0" class="inputText_Full twControl twDateSelector" ;="" onblur="updateAvgPerWeek(0,0)" initialvalue="" value="" name="tw#local#quoteComparison#0#country#0#projectedFirstShipDate" style="white-space:nowrap;">
                <div id="projectedFirstShipDate_0_0" lang="" dojoattachpoint="pickerDiv" widgetid="projectedFirstShipDate_0_0" name="tw#local#quoteComparison#0#country#0#projectedFirstShipDate">
                    <span dojoattachpoint="leftPicker">
                        <div id="widget_dijit_form_DateTextBox_36" class="dijit dijitReset dijitInlineTable dijitLeft dateSelectionSin…tBox dijitComboBox dijitDateTextBox dijitComboBoxOpenOnClick" role="combobox" widgetid="dijit_form_DateTextBox_36">
                            <div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" role="presentation" dojoattachpoint="_buttonNode, _popupStateNode" popupactive="true"></div>
                            <div class="dijitReset dijitValidationContainer"></div>
                            <div class="dijitReset dijitInputField dijitInputContainer">
                                <input id="dijit_form_DateTextBox_36" class="dijitReset dijitInputInner" type="text" aria-haspopup="true" role="textbox" dojoattachpoint="textbox,focusNode" autocomplete="off" aria-valuenow="null" aria-invalid="false" tabindex="0" value="" style="" delocalized="null" aria-disabled="false"></input>
                                <input type="hidden" value=""></input>
                            </div>
                        </div>
                    </span>
                    <span dojoattachpoint="rightPicker"></span>
                    <span style="position: absolute;" dojoattachpoint="calImage"></span>
                    <input id="projectedFirstShipDate_0_0" type="text" isdatefield="true" name="tw#local#quoteComparison#0#country#0#projectedFirstShipDate" style="display:none" dojoattachpoint="hiddenInput" delocalized="null"></input>
                </div>
            </div>
        </div>
    </td>
    <td id="InDate0_0" class="twTableTD" align="center" ;="" onclick="updateAvgPerWeek(0,0)">
        <div style="padding-right: 20px;">
            <div id="dateWrap-inDate_0_0" class="inputText_Full twControl twDateSelector" ;="" onblur="updateAvgPerWeek(0,0)" initialvalue="" value="" name="tw#local#quoteComparison#0#country#0#inDate" style="white-space:nowrap;">
                <div id="inDate_0_0" lang="" dojoattachpoint="pickerDiv" widgetid="inDate_0_0" name="tw#local#quoteComparison#0#country#0#inDate">
                    <span dojoattachpoint="leftPicker">
                        <div id="widget_dijit_form_DateTextBox_35" class="dijit dijitReset dijitInlineTable dijitLeft dateSelectionSin…tBox dijitComboBox dijitDateTextBox dijitComboBoxOpenOnClick" role="combobox" widgetid="dijit_form_DateTextBox_35">
                            <div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" role="presentation" dojoattachpoint="_buttonNode, _popupStateNode" popupactive="true"></div>
                            <div class="dijitReset dijitValidationContainer"></div>
                            <div class="dijitReset dijitInputField dijitInputContainer">
                                <input id="dijit_form_DateTextBox_35" class="dijitReset dijitInputInner" type="text" aria-haspopup="true" role="textbox" dojoattachpoint="textbox,focusNode" autocomplete="off" aria-valuenow="null" aria-invalid="false" tabindex="0" value="" style="" delocalized="null" aria-disabled="false"></input>
                                <input type="hidden" value=""></input>
                            </div>
                        </div>
                    </span>
                    <span dojoattachpoint="rightPicker"></span>
                    <span style="position: absolute;" dojoattachpoint="calImage"></span>
                    <input id="inDate_0_0" type="text" isdatefield="true" name="tw#local#quoteComparison#0#country#0#inDate" style="display:none" dojoattachpoint="hiddenInput" delocalized="null"></input>
                </div>
            </div>
        </div>
    </td>
    <td id="OutDate0_0" class="twTableTD" align="center" onclick="updateAvgPerWeek(0,0)">
        <div style="padding-right: 20px;">
            <div id="dateWrap-outDate_0_0" class="inputText_Full twControl twDateSelector" ;="" onblur="updateAvgPerWeek(0,0)" initialvalue="" value="" name="tw#local#quoteComparison#0#country#0#outDate" style="white-space:nowrap;">
                <div id="outDate_0_0" lang="" dojoattachpoint="pickerDiv" widgetid="outDate_0_0" name="tw#local#quoteComparison#0#country#0#outDate">
                    <span dojoattachpoint="leftPicker">
                        <div id="widget_dijit_form_DateTextBox_34" class="dijit dijitReset dijitInlineTable dijitLeft dateSelectionSin…tBox dijitComboBox dijitDateTextBox dijitComboBoxOpenOnClick" role="combobox" widgetid="dijit_form_DateTextBox_34">
                            <div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" role="presentation" dojoattachpoint="_buttonNode, _popupStateNode" popupactive="true"></div>
                            <div class="dijitReset dijitValidationContainer"></div>
                            <div class="dijitReset dijitInputField dijitInputContainer">
                                <input id="dijit_form_DateTextBox_34" class="dijitReset dijitInputInner" type="text" aria-haspopup="true" role="textbox" dojoattachpoint="textbox,focusNode" autocomplete="off" aria-valuenow="null" aria-invalid="false" tabindex="0" value="" style="" delocalized="null" aria-disabled="false"></input>
                                <input type="hidden" value=""></input>
                            </div>
                        </div>
                    </span>
                    <span dojoattachpoint="rightPicker"></span>
                    <span style="position: absolute;" dojoattachpoint="calImage"></span>
                    <input id="outDate_0_0" type="text" isdatefield="true" name="tw#local#quoteComparison#0#country#0#outDate" style="display:none" dojoattachpoint="hiddenInput" delocalized="null"></input>
                </div>
            </div>
        </div>
    </td>
    <td id="BuyQuantity0_0" class="twTableTD" align="center" onblur="updateAvgPerWeek(0,0)" name="BuyQuantity0"></td>
    <td id="TotalCost0_0" class="twTableTD" align="center" name="TotalCost0"></td>
    <td id="NumberOfWarehouses0_0" class="twTableTD" align="center" onblur="updateAvgPerWeek(0,0)" td=""></td>
    <!--

    # of Warehouses

    -->
    <td id="AveragePerWarehouse0_0" class="twTableTD" align="center" name="AvgPerWhouseWeek0"></td>
    <!--

    Cost per Warehouse

    -->`enter code here`
    <td id="ProjectedSellPrice0_0" class="twTableTD" align="center" td=""></td>
    <!--

     Projected Sell Price 

    -->
    <td id="PercentOfTotal0_0" class="twTableTD" align="center"></td>
    <td class="twTableTD" align="center" rowspan="2"></td>
</tr>


QA GM 04012014144项目名称



`在这里输入代码`
我能想到的最好的xpath是:

//td[normalize-space()='QA GM 04012014 1424 Item Name']/following-sibling::td[contains(@id, 'shipDate')]//input[contains(@class,'dijitInputInner')]
让我解释一下:

这一部分查找包含您要查找的文本的td元素,normalize-space()调用与text()类似,但会修剪文本前后的任何空格&我发现它是非常宝贵的,因为不久前发现了它。text()将返回空白,通常很难匹配

//td[normalize-space()=“QA GM 04012014 1424项目名称”]

下一部分将查找前一元素之后的所有td。从提供的代码片段中,可以找到下面所有13个td

/以下兄弟姐妹::td

通过只查找包含您感兴趣的ID的td来缩小13的范围,这比使用硬编码数字(如
/following sibling::td[2]
查找第二个td要好

/以下同级::td[包含(@id,'shipDate')]

然后找到你感兴趣的输入字段,有很多方法可以做到这一点,选择你喜欢的

//input[contains(@class,'dijitInputInner')]
//input[contains(@id,'dijit_form_DateTextBox')]

我希望这足够清楚&对您来说效果很好,如果不清楚,请告诉我

我可以通过//b[包含(,'QA GM 04012014 1424项目名称')]/parent::p/parent::td/parent::tr。。。现在,我想知道如何深入到我想要的项目。有点困难。哇,你可能想把你的代码片段裁剪成有问题的元素,以及周围的一些元素。很有意思的是,我只把它裁剪成了该区域周围的部分。真管用!这比我想到的要干净得多。我提出了“driver.findelelement(By.xpath(//b[contains(,”+prop.getProperty(“item.text”)+“item Name”+”)]/parent::p/parent::td/parent::tr/td[6]/div/div/div/span/div/div[3]/input”).clear();”。谢谢很好,很乐意帮忙:)