【问题标题】:Python Selenium Wait for user to click a buttonPython Selenium 等待用户单击按钮
【发布时间】:2019-01-11 20:35:15
【问题描述】:

上下文:

  1. 我的脚本使用 selenium webdriver 启动到网站
  2. 用户在网站上填写了一些东西
  3. 用户将单击一个按钮,该按钮将弹出一个confirm()dialog box,询问用户“您要提交数据吗”

我的意图:

我的脚本会等到用户点击按钮。一旦它检测到用户点击了按钮,我的脚本就会得到一个元素的值,然后(不知何故)点击dialog box上的OK


问题:

如何等待用户点击按钮?

然后如何在dialog box 上单击“确定”?


附加说明:

使用:chromedriver,Python 2.7

按钮:<input id="submitID" type="button" class="medium" value="Submit filled Data">


[编辑] 一些代码 sn-p:

对话框弹出是javascript popup:

    if (window.confirm("Are you sure you want to submit the data?")) {
        this.SaveData();
    }

我的代码(针对这个问题进行了简化和修改):

from selenium import webdriver
from selenium.common.exceptions import WebDriverException

PATH_TO_CHROMEDRIVER = 'path/to/chromedriver'
URL = 'https://website-asking-user-to-fill-in-stuff.com'

driver = webdriver.Chrome(PATH_TO_CHROMEDRIVER)
driver.get(URL)

while True:
    # loop until user close the chrome.
    # If anyone has any better idea to
    # WAIT TILL USER CLOSE THE WEBDRIVER, PLEASE SHARE IT HERE

    try:
        # --- main part of the code ---

        waitForUserToClickButton() # this is what I need help with

        driver.find_element_by_id('elementID').text

        confirmJavascriptPopup() # this is also what I need help with

    except WebDriverException:
        print 'User closed the browser'
        exit()

【问题讨论】:

  • 是 javascript 还是 html 弹出窗口?此外,您应该分享一些代码 sn-p 来了解您到目前为止尝试过的内容,并分享 html 来获取警报(如果它是 html 弹出窗口)
  • 这是一个非常有趣的问题,但我认为通过 Selenium 是不可能的。
  • @theGuy 这是一个 javascript 弹出窗口。

标签: python selenium button selenium-webdriver click


【解决方案1】:

这是我设计的一个解决方案,它可能并不适合所有人。轮询网址...

poll_rate = 1
current_url = driver.current_url
while driver.current_url == current_url:
  time.sleep(poll_rate)

谁能提出更好的解决方案?!

我很震惊,几乎不可能以实用的方式检测用户输入。

【讨论】:

    【解决方案2】:

    Q:如何等待用户点击按钮?

    在这种情况下,您可以在 selenium 中引入WebDriverWait,即显式等待

    你可以试试这个代码

    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.element_to_be_clickable((By.ID, 'submitID')))  
    

    问。然后如何在对话框中单击“确定”?

    在这种情况下,首先您必须将 Web 驱动程序的焦点切换到警报,然后您才能单击它。

        alert = browser.switch_to.alert
        alert.accept()
        print("alert accepted")  
    

    更新 1:

    当您执行点击操作时,会弹出一个警报。您可以使用以下代码从警报中提取文本:

    alert = browser.switch_to.alert
    msg_from_alert = alert.text  
    alert.accept() 
    

    现在您可以简单地将其与您已知的预期消息相匹配。

    expected_msg = "some msg from alert"  
    
    from collections import Counter
    Counter(msg_from_alert) == Counter(expected_msg)
    True
    

    【讨论】:

    • EC.element_to_be_clickable 将等到按钮可以点击,不幸的是,该按钮一直都可以点击。 但是至于第二个答案,它奏效了。
    • 可点击元素检查网页元素的可见性以及网页元素是否启用。通过结合这两个条件,我们假设元素应该处于点击状态。现在,如果覆盖有任何问题,必须由脚本编写者处理。
    • 哦,我想你误解了我的问题。我希望脚本在用户单击单击按钮时等待/检测,而不是在按钮可单击时等待/检测。
    • 好的,当您执行点击操作时,手动会发生什么?我猜在那之后出现了警报?
    • 是的,如果您正在考虑使用WebDriverWait(driver, 10).until(EC.alert_is_present()),那么我已经考虑过了。 (查看我的最新编辑)
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2021-03-18
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多