【问题标题】:Python/Selenium:Different ways to click this specific buttonPython/Selenium:单击此特定按钮的不同方法
【发布时间】:2018-08-07 12:20:06
【问题描述】:

我刚从使用 VBA 切换过来时,正在尝试总体上理解 Python。我对您可以解决这个单一问题的可能方式感兴趣。我已经通过直接访问链接绕过它,但我需要在这里理解和应用。

from selenium import webdriver

chromedriver = r'C:\Users\dd\Desktop\chromedriver.exe'
browser = webdriver.Chrome(chromedriver)
url = 'https://www.fake.com/'

browser.get(url)

browser.find_element_by_id('txtLoginUserName').send_keys("Hello")
browser.find_element_by_id('txtLoginPassword').send_keys("There")
browser.find_element_by_id('btnLogin').click()

此时,我正在尝试导航到特定按钮/链接。 这是来自页面/元素的信息

 <a href="javascript:void(0)" style="text-decoration:none" onclick="InitiateCallBack('187', 'True', 'T-Mobile', 'https://www.fake.com/', 'TMobile')">T-Mobile</a>

以下是我尝试过的一些事情:

for elem in browser.find_elements_by_xpath("//*[contains(text(), 'T-Mobile')]"):
    elem.click

browser.execute_script("InitiateCallBack(187, True, T-Mobile, https://www.fake.com/, TMobile)")

我还尝试查找标签并使用 css 选择器,我因沮丧而删除了所有这些标签!

具体问题

  1. 如何利用内文“T-Mobile”点击按钮?
  2. 如何执行 onclick 事件?

我已经尝试阅读以下链接,但仍然没有成功以不同的方式进入。部分原因可能是因为我还不了解具体的语法。这只是我看过的一些东西。来这里之前,我花了大约 3 个小时尝试各种事情!

selenium python onclick() gives StaleElementReferenceException http://selenium-python.readthedocs.io/locating-elements.html Python: Selenium to simulate onclick https://stackoverflow.com/questions/43531654/simulate-a-onclick-with-selenium-https://stackoverflow.com/questions/45360707/python-selenium-using-onclick Running javascript in Selenium using Python

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    如何利用内文“T-Mobile”点击按钮?

    find_elements_by_link_text 适合这种情况。

    elements = driver.find_elements_by_link_text('T-Mobile')
    for elem in elements:
        elem.click()
    

    如果您没有完整的确切文本,还有一个 by_partial_link_text 定位器。

    如何执行 onclick 事件?

    最简单的方法是简单地在元素上调用.click(),如上所示,事件自然应该在那个时候执行。

    或者,您可以检索onclick 属性并使用driver.execute_script 来运行js。

    for elem in elements:
        script = elem.get_attribute('onlcick')
        driver.execute_script(script)
    

    编辑:

    请注意,在您的代码中您执行了element.click - 这没有任何作用。 element.click()(注意括号)调用 click 方法。

    有没有办法将 browser.execute_script() 用于 onclick 事件

    execute_script 可以触发等效事件,但这样做可能会错过更多的侦听器。使用元素点击方法是最合理的。该站点的许多实施细节可能会阻碍您的自动化工作,但这些可能性是无穷无尽的。没有看到实际背景,很难说。
    可以使用 JS 方法单击元素或以其他方式与页面交互,但您可能会错过“正常”使用网站时发生的某些事件侦听器;您想或多或少地模仿正常使用。

    【讨论】:

    • 非常感谢。我认为这可能是由于我正在测试的网站的制作方式,但它没有点击任何东西,但我没有收到任何错误。它是一个项目/单词列表,可以像超链接一样单击,但也可以通过它进行搜索。我确信这行得通。
    • 我忘了问,但有没有办法利用 browser.execute_script() 进行 onclick 事件?
    • @Noctsol 请注意,在您的代码中您执行了element.click - 这没有任何作用。 element.click()(注意括号)调用 click 方法。 execute_script 可以触发等效事件,但这样做可能会错过更多的侦听器。使用元素点击方法是最合理的。该站点的许多实施细节可能会阻碍您的自动化工作,但这些可能性是无穷无尽的。在没有亲眼看到实际情况的情况下,很难说。您可以尝试使用 JS 方法点击元素,但您可能会错过某些事件监听器。
    • @sytech 有了您评论中的所有文字,我认为您应该用所有这些想法更新您的答案,并将您的答案变成一个很好的答案。点赞!!!
    • @DebanjanB 感谢您的建议。我将其添加到答案中。
    【解决方案2】:

    根据您分享的HTML,很明显网站 使用JavaScript。因此,对于链接上的click(),文本为T-Mobile,您必须使用expected_conditions 子句作为element_to_be_clickable 来诱导WebDriverWait,您可以使用以下代码块:

    WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[contains(.,'T-Mobile')]"))).click()
    

    【讨论】:

      【解决方案3】:

      你可以使用它

       <div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
          <input class="v_small" type="button"></input>
          <span>
                Reset
          </span>
      

      【讨论】:

        猜你喜欢
        • 2021-03-31
        • 1970-01-01
        • 2021-05-04
        • 2020-01-10
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多