python - 硒无法点击下一页
问题描述
所以我一直在使用 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 的当前状态,那么我可以看到正在发生的事情,这对调试很有帮助。
解决方案
您需要等待按钮可点击。
诱导WebDriverWait
() 并等待element_to_be_clickable
() 并使用xpath
or 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
推荐阅读
- c# - How to manage multiple timers to control various elements of Unity game?
- c++ - 如何在类中将向量初始化为一定长度?
- php - Laravel 5.6 迁移问题
- perl - CentOS 服务器上的 Perl setpriority 函数
- powershell - 在 PowerShell v2 中构建发布请求的问题
- java - 如何在 Java 中声明二维数组并实现它们(过程编程)
- php - 在 wordpress 中使用 sql 查询的结果进行表计算
- c# - 带有 LIST 对象和其他混合数据类型的 POST 方法的 FormUrlEncodedContent
- sql-server - SQL Pivot 数据到每个项目一行
- php - PHP API:两个环境中的相同代码,在同一台服务器上,不同的速度