当按钮名称定期更改时,单击表格中的按钮

时间:2018-04-16 18:02:40

标签: javascript python selenium

我正在使用Python和Selenium点击网站来选择和预订房间。该网站提供了一个可用的房间表。我想找到一个特定的房间并点击表格中与该房间相关的按钮....但按钮名称会根据房间在桌子中的位置而改变。它所在的位置部分取决于我在网站上运行时可用的其他房间。

在这个例子中,我想保留'Room 34'。

该表似乎由以下标识:

<table id="MainContent_tblPage"....>

包含“房间34”的表格的行或部分由以下标识(根据房间34出现在表格中的位置而变化...这取决于有多少其他房间可用):

<tr id=MainContent_rptrPropertyList_trContent_1" >

我想在此示例中单击的按钮是:

name="_ctl0:MainContent:rptrPropertyList:_ctl2:rptPropertyRooms:
_ctl0:btnSelect"

(...但按钮名称会根据表格中显示的其他房间而改变...)

我的问题:如果按钮名称根据表内容/行动态变化,如何找到并单击表中的正确按钮...但按钮总是与我想要查找的文本在一行? / p>

我正在查看的部分的HTML(...抱歉,我不确定如何在不改变可能对回答我的问题很重要的事情的情况下使其更具可读性):

<table id="tblPropertyList" cellpading="0" cellspacing="0" align="center" border="0" width="100%">                                 
                                        <tbody><tr id="MainContent_rptrPropertyList_trContent_0">
                                        ##...snip...similar code as shown under  <tr id="MainContent_rptrPropertyList_trContent_1"> below...
                                        ##...I cut it out to save space but I can add it back if it helps  --JRrcgp                                 

                                        <tr id="MainContent_rptrPropertyList_trContent_1">
        <td class="room_grid_row">
                                                <table cellpading="0" cellspacing="0" width="100%;">

                                                    <tbody><tr>
                                                        <td colspan="2" class="room_grid_heading_2">
                                                               Hornswoggle Tower
                                                                              <br><span class="text2">CityPlace</span>
                                                        </td>
                                                    </tr>

                                                    <tr>
                                                        <td align="right" valign="top">
                                                          <div class="room_grid_image">
                                                              <a onclick="javascript:ShowGallery('lightSlider_1');" title="Room 34">
                                                              <img src="imgHandler.ashx?image=\\fileserver.inncenter.pms.inrd.live\\Share1\\Assets/pics/roomClass_pic_8455.jpg" id="MainContent_rptrPropertyList_Image1_1" onerror="showNoImage(this);" style="visibility:true;">
                                                                  </a>
                                                          </div>
                                                          <div class="demo">
                                                            <ul id="lightSlider_1" style="display:none">

                                                                        <li data-thumb="imgHandler.ashx?image=\\fileserver.inncenter.pms.inrd.live\\Share1\\Assets/pics/roomClass_pic_8455.jpg">
                                                                            <img src="imgHandler.ashx?image=\\fileserver.inncenter.pms.inrd.live\\Share1\\Assets/pics/roomClass_pic_8455.jpg">
                                                                        </li>

                                                            </ul>
                                                          </div>
                                                      </td>
                                                        <td valign="top" width="100%" class="padding_left_1">
                                                                <table cellspacing="0" cellpadding="0" width="100%">
                                                                    <tbody><tr>
                                                                        <td class="room_grid_heading" colspan="3">
                                                                              <div class="floatleft">                                                                       
                                                                            Room 34
                                                                                  </div>
                                                                              <div class="floatright">
                                                                                     <span class="room_grid_from_rate_text1">From </span>
                                                                                    <span id="MainContent_rptrPropertyList_lblMinRate_1" class="room_grid_from_rate_text2">$88</span>
                                                                                    <!--<span class="room_grid_from_rate_text1">/Night</span>-->
                                                                                  </div>

                                                                        </td>
                                                                    </tr>

                                                                    <tr>
                                                                        <td colspan="3">
                                                                            <table width="100%" cellpading="0" cellspacing="0">
                                                                                <tbody><tr>
                                                                                    <td valign="top" class="room_grid_discription_2">

                                                                                                <span id="MainContent_rptrPropertyList_reptSectionInline_1_lblSectionInline_0" class="more"><font face="Verdana">Text description of room.</font></span>

                                                                                    </td>
                                                                                </tr>
                                                                                <tr>
                                                                                    <td valign="top">
                                                                                        <table cellpadding="0" cellspacing="0">
                                                                                        <tbody><tr>

                                                                                    </tr>
                                                                                            </tbody></table>
                                                                                        </td>
                                                                                </tr>                                                                                
                                                                            </tbody></table>
                                                                        </td>
                                                                    </tr>
                                                                    <tr>
                                                                        <td id="MainContent_rptrPropertyList_tdSingleRate_1" style="display: none;">
                                                                        &nbsp;
                                                                            <font class="Bold"> $<span id="MainContent_rptrPropertyList_lblratePrice_1">88</span><br></font> per night
                                                                        </td>

                                                                    </tr>
                                                                    <tr>
                                                                       <td valign="bottom" align="left">
                                                                                                    <table align="left" width="100%" cellspacing="0" cellpadding="0">

                                                                                    <tbody><tr>
                                                                                        <td align="left" nowrap="" width="80%" class="displayRatePlan"><span class="room_grid_rateplanname">
                                                                                                Best Available Rate
                                                                                            </span><span class="room_grid_rateplan_moreinfo">(<a class="thickbox" id="lnkMoreInfo" title="Best Available Rate" href="#TB_inline?height=Div8&amp;width=Div7&amp;inlineId=MainContent_rptrPropertyList_rptPropertyRooms_1_Div9_0">More Info</a>)</span>

                                                                                            <div id="MainContent_rptrPropertyList_rptPropertyRooms_1_Div9_0" class="roomClassSection" style="display: none;">
                                                                                                                    <div class="popupWidth" id="Div7">
                                                                                                                        <div class="popupHeight" id="Div8">                                                                                                                                
                                                                                                                            <table class="more_info_table" cellspacing="0" cellpadding="0" align="center" border="0">
                                                                                                                                <tbody><tr>
                                                                                                                                    <td>
                                                                                                                                        <div id="MainContent_rptrPropertyList_rptPropertyRooms_1_excludeRoom_DIV_0">

                                                                                                                                                    </div></td></tr><tr>
                                                                                                                                                        <td class="alt1">
                                                                                                                                                         Name:
                                                                                                                                                        </td>
                                                                                                                                                        <td style="width: 90%">
                                                                                                                                                            Room Rate
                                                                                                                                                        </td>
                                                                                                                                                    </tr>
                                                                                                                                                    <tr>
                                                                                                                                                        <td class="alt1">
                                                                                                                                                           Date:
                                                                                                                                                        </td>
                                                                                                                                                        <td>
                                                                                                                                                            Fri, Apr 27, 2018 - Sun, Apr 29, 2018
                                                                                                                                                        </td>
                                                                                                                                                    </tr>
                                                                                                                                                    <tr>
                                                                                                                                                        <td class="alt1">
                                                                                                                                                            Policy:
                                                                                                                                                        </td>
                                                                                                                                                        <td>

                                                                                                                                                        </td>
                                                                                                                                                    </tr>



                                                                                                                            </tbody></table>
                                                                                                                        </div>
                                                                                                                    </div>
                                                                                                                </div>
                                                                                        </td> 
                                                                                        <td id="MainContent_rptrPropertyList_rptPropertyRooms_1_tdRateDescription_0" align="right" nowrap="nowrap" width="12%">
                                                                                            <span class="room_grid_fullrate">

                                                                                               $188


                                                                                            </span>
                                                                                            <span class="room_grid_fullrate_avgnightly">
                                                                                            &nbsp;<span id="MainContent_rptrPropertyList_rptPropertyRooms_1_lblRateMsg_0">(Avg nightly rate)</span></span>
                                                                                        </td>

                                                                                        <td width="8%" align="left">
                                                                            <input type="submit" name="_ctl0:MainContent:rptrPropertyList:_ctl2:rptPropertyRooms:_ctl0:btnSelect" value="Select" onclick="ShowProgress();" language="javascript" id="MainContent_rptrPropertyList_rptPropertyRooms_1_btnSelect_0" class="button green">
                                                                        </td>


                                                                                    </tr>


                                                                            </tbody></table>                                                      
                                                                        </td>                                                                            
                                                                    </tr>                                                                        
                                                                </tbody></table>
                                                            </td>
                                                    </tr>
                                                </tbody></table>
                                            </td>
    </tr>


                                        <tr id="MainContent_rptrPropertyList_trContent_2">
                                        ##...snip...similar code as shown under  <tr id="MainContent_rptrPropertyList_trContent_1"> above...
                                        <tr id="MainContent_rptrPropertyList_trContent_3">
                                        ##...snip...similar code as shown under  <tr id="MainContent_rptrPropertyList_trContent_1"> above...
                                        ##...this continues to repeat once for each room available

编辑:我目前正在通过硬编码我点击的按钮来解决这个问题。我使用Selenium导航到创建可用房间表的网页,然后点击今天的相应按钮。但是按钮的名称将来会改变:

room34 = browser.find_element_by_name('_ctl0:MainContent:rptrPropertyList:_ctl31:rptPropertyRooms:_ctl0:btnSelect')
room34.click()    
编辑2:我已经播放了@Grasshopper的建议。他的代码对我不起作用,但我做了一些我认为有所改进的改变......我错了。我正在删除编辑2的其余部分,以免混淆问题。

2 个答案:

答案 0 :(得分:0)

试试这个xpath - "//div[normalize-space(.)='Room 34']/ancestor::tbody/tr/td//input[@type='submit']"

The Room 34&#39;可以用python变量代替。 normalize-space是必需的,因为文本有很多空格。

答案 1 :(得分:0)

点击带有name的按钮作为 _ctl0:MainContent:rptrPropertyList:_ctl2:rptPropertyRooms:_ctl0:btnSelect ,相对于文字为 Room 34 <的元素您可以使用以下任一代码:

  • 使用following

    driver.find_element_by_xpath("//div[@class='room_grid_image']/a[contains(@title,'Room 34')]//following::input[1]").click()
    
  • 使用following-sibling

    driver.find_element_by_xpath("//div[@class='room_grid_image']/a[contains(@title,'Room 34')]//following-sibling::input[1]").click()