【问题标题】:How to detect a button.click() failure in Selenium?如何检测 Selenium 中的 button.click() 失败?
【发布时间】:2019-05-01 23:28:50
【问题描述】:

我有一个 Selenium 3 Python 脚本,用于归档 FTC complaints 以进行骚扰电话。今天,一个恶棍通过使用数字“0”(字面意思是 0)成功了。 FTC 网站拒绝了该号码,但我的脚本未能检测到故障。

这是我的 Python 脚本中驱动投诉流程的相关部分。 Here is a pastebin 拒绝号码的 FTC 页面。根据Selenium docsbutton_continue.click() 没有返回值(如果我正确解析文档;请参阅标题用户输入 - 填写表单)。

# print("Clicking Continue")
button_continue = driver.find_element_by_id("StepTwoSubmitButton")
button_continue.click()

我还购买了Test-Driven Development with Python 这本书,但是我在网上搜索时发现的 Selenium 命中结果却是书中的两页。 (这非常令人失望;尽管书名如此,但不推荐用于此类任务)。

我的问题是,如何使用 Selenium 3 检测故障?


这是导致问题的 FTC 页面的特定 Javascript。来自the pastebin

<div class="s_form_verif_bttn_sl">
    <label for="StepTwoSubmitButton">
        <input type="submit" name="StepTwoSubmitButton" value="Submit" onclick="validateform();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;StepTwoSubmitButton&quot;, &quot;&quot;, true, &quot;StepTwoEntry&quot;, &quot;&quot;, false, false))" id="StepTwoSubmitButton" accesskey="s" tabindex="17" class="th_s" />
    </label>&nbsp;&nbsp;
    <label for="StepTwoCancelButton"> 
        <input type="submit" name="StepTwoCancelButton" value="Cancel" id="StepTwoCancelButton" accesskey="s" tabindex="18" class="th_s" />
    </label>
</div>

我能够手动重现提交失败。下面是提交表单结果的屏幕截图。当我在 Developer Console 中查看该过程时,我没有看到任何异常情况,例如未捕获的异常。


这里是软件包版本。

$ apt-cache policy chromium-browser
chromium-browser:
  Installed: 73.0.3683.86-0ubuntu0.18.04.1
  Candidate: 73.0.3683.86-0ubuntu0.18.04.1

$ apt-cache policy python3-selenium
python3-selenium:
  Installed: 3.8.0+dfsg1-3
  Candidate: 3.8.0+dfsg1-3

$ apt-cache policy chromium-chromedriver
chromium-chromedriver:
  Installed: 73.0.3683.86-0ubuntu0.18.04.1
  Candidate: 73.0.3683.86-0ubuntu0.18.04.1

$ apt-cache policy python3
python3:
  Installed: 3.6.7-1~18.04
  Candidate: 3.6.7-1~18.04

【问题讨论】:

  • 您使用的 selenium 版本已经过时了。我很惊讶它完全适用于该版本的 chromium。您应该使用 pip 从 PyPI 安装最新版本。
  • 谢谢科里。是的,陈旧的软件听起来很适合课程。我不希望 Pip 在系统上。在我必须运行的生产 Web 服务器上,它给我带来了太多问题。最终,我在他们的 GitHub 上找到了错误报告,并且问题已关闭,因为无法修复,并且像用户这样的 cmets 必须修复它们。我鄙视坏掉的工具。
  • pip 已经与较新版本的 python 捆绑在一起,所以你可能已经安装了它。你也可以在没有 pip 的情况下安装最新的 selenium。

标签: python selenium selenium-chromedriver webdriverwait error-checking


【解决方案1】:

click() 在失败时应该引发异常,并且 Python 客户端绑定中的所有异常都派生自 WebDriverException

from selenium.common.exceptions import WebDriverException

button_continue = driver.find_element_by_id("StepTwoSubmitButton")
try:
    button_continue.click()
except WebDriverException as e:
    print('oops. click failed')
    print(e)

【讨论】:

  • 谢谢。我绝对没有看到未捕获的异常。原谅我的无知...... Python是否只在有处理程序的情况下抛出?如果您需要运行,我的脚本位于ftc-chrome.py
【解决方案2】:

该元素是启用了JavaScript 的元素,因此在理想情况下在其上调用click() 您需要为element_to_be_clickable() 诱导WebDriverWait 并将其包装在try-catch{} 中,您可以使用Locator Strategies:

  • 使用CSS_SELECTOR

    try:
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='StepTwoSubmitButton']"))).click()
    except TimeoutException as e:
        print("Element click failed")
    
  • 使用XPATH

    try:
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='StepTwoSubmitButton')]"))).click()
    except TimeoutException as e:
        print("Element click failed")
    
  • 注意:您必须添加以下导入:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多