首页 > 解决方案 > 硒无法点击下一页

问题描述

所以我一直在使用 selenium 尝试从我当地的 ymca 自动注册游泳点。我有这个页面,我正在尝试单击所有单圈复选框,然后单击下一页。

圈注册

该页面具有以下 html 代码:

> <main class="scheduleVisitOnline container" role="main">    <!-- See
> app.jsx for React component -->    <div
> id="schedule-visit-wizard-app">
>     <div class="chooseMembersStep">
>      <h1 class="page-title">
>       Schedule a Visit
>      </h1>
>      <p>
>       <strong>
>        Ann Arbor YMCA
>       </strong>
>       <br/>
>       <a href="#">
>        Change Branch
>       </a>
>      </p>
>      <div class="chooseMembersStep__members">
>       <label class="control-label">
>        Select visiting members and any reservation-only areas you intend to utilize
>       </label>
>       <table class="chooseMembersStep__members-table">
>        <tbody>
>         <tr class="chooseMembersStep__member">
>          <td>
>           <div class="pretty p-svg p-curve">
>            <input checked="" id="member_3572218" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td colspan="2">
>           <label class="chooseMembersStep__member-name" for="member_3572218">
>            Patrick McKeever
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_39b9bf20-6493-4bd8-b2c4-6f6a4ab5a69d" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_39b9bf20-6493-4bd8-b2c4-6f6a4ab5a69d">
>            Hoops M-F / 7-8a /- 2 Half Courts (1 reservation per member family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_9a486991-672e-4a87-9130-05f379344968" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_9a486991-672e-4a87-9130-05f379344968">
>            Hoops M-S / 8a-8p /- 4 Half Courts (1 reservation per member family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_23d2d590-475d-44cd-84fd-c071bf299f89" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_23d2d590-475d-44cd-84fd-c071bf299f89">
>            Indoor Wellness Center
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_b6470dcf-ab5d-44e5-85e2-4a50a1f7ffc7" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_b6470dcf-ab5d-44e5-85e2-4a50a1f7ffc7">
>            Lap Pool - Lane 1 (1 reservation allows 4 members from same family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_34b69cbf-c890-4090-912e-1a2e32c805a9" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_34b69cbf-c890-4090-912e-1a2e32c805a9">
>            Lap Pool - Lane 2 (1 reservation allows 4 members from same family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_7f453950-a5ba-424a-ac1e-a8c968519ab7" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_7f453950-a5ba-424a-ac1e-a8c968519ab7">
>            Lap Pool - Lane 3 (1 reservation allows 4 members from same family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_28fed658-ad4e-4721-8b90-d6c943f0fac9" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_28fed658-ad4e-4721-8b90-d6c943f0fac9">
>            Lap Pool - Lane 4 (1 reservation allows 4 members from same family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_c22ab33c-7850-4a52-a6e9-8737647ea54f" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_c22ab33c-7850-4a52-a6e9-8737647ea54f">
>            Lap Pool - Lane 5 (1 reservation allows 4 members from same family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_24177575-8769-405b-af6a-5e5afdb10c56" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_24177575-8769-405b-af6a-5e5afdb10c56">
>            Lap Pool - Lane 6 (1 reservation allows 4 members from same family account)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_0ee4cec1-2149-4af5-9c76-22abc6574d64" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_0ee4cec1-2149-4af5-9c76-22abc6574d64">
>            Showers (Reservation only necessary if you don't have a reservation in another area of the building)
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-area">
>          <td>
>          </td>
>          <td class="chooseMembersStep__member-area-checkbox-col">
>           <div class="pretty p-svg p-curve">
>            <input id="3572218_084dfd23-3ab5-4624-bcc8-bb7f8a25d30d" type="checkbox"/>
>            <div class="state p-success">
>             <svg class="svg svg-icon" viewbox="0 0 20 20">
>              <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z"
> style="stroke: white; fill: white;">
>              </path>
>             </svg>
>             <label>
>             </label>
>            </div>
>           </div>
>          </td>
>          <td class="chooseMembersStep__member-area-name-col">
>           <label class="chooseMembersStep__area-name" for="3572218_084dfd23-3ab5-4624-bcc8-bb7f8a25d30d">
>            Track
>           </label>
>          </td>
>         </tr>
>         <tr class="chooseMembersStep__member-spacer">
>          <td colspan="3">
>          </td>
>         </tr>
>        </tbody>
>       </table>
>      </div>
>      <div class="ctas">
>       <button class="btn" type="button">
>        Back
>       </button>
>       <button class="btn btn-primary" type="button">
>        Next
>       </button>
>      </div>
>     </div>    </div>    <div style="clear: both;">    </div>   </main>

我一直在使用这个 python 代码来单击 6 个元素,然后单击下一个按钮:

wd.maximize_window()

actions = ActionChains(wd)

for chk in wd.find_elements_by_xpath("//td[.//label[contains(.,'Lap Pool - Lane')]]")[:4]:
  actions.move_to_element(chk).click(chk).perform()

wd.fullscreen_window()

wd.find_element_by_xpath('//*[@id="schedule-visit-wizard-app"]/div/div[2]/button[2]').click()

我刚刚在点击六个游泳框时得到了帮助,但它似乎仍然没有进入下一页。如果那是因为实际上没有选择游泳框,或者它没有单击下一步,但我运行该 html 代码后的 html 代码是相同的。

表示页面没有变化。有任何想法吗?

另外,如果有人知道如何呈现 webdriver/webpage 的当前状态,那么我可以看到正在发生的事情,这对调试很有帮助。

标签: pythonseleniumxpathcss-selectorswebdriverwait

解决方案


您需要等待按钮可点击。

诱导WebDriverWait() 并等待element_to_be_clickable() 并使用xpathor css selector

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn.btn-primary"))).click()

或者

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//button[@class='btn btn-primary' and contains(.,'Next')]"))).click()

您需要导入以下库。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

推荐阅读