【问题标题】:Selenium Webdriver not clicking on elementSelenium Webdriver 没有点击元素
【发布时间】:2017-03-28 20:02:32
【问题描述】:

我正在设置网络驱动程序以从我在工作中使用的几个网站上抓取报告数字。所有这些都受密码保护,直到现在还没有问题。这是我尝试与之交互的登录屏幕:

https://ssp.vertamedia.com/

我在 Firefox 中使用 Selenium webdriver 和 Python 3.6。

在这个网站上,webdriver 需要输入用户名,然后在密码输入和提交按钮可见之前与“下一步”按钮交互。我可以填写用户名,但到目前为止还无法让网络驱动程序与“下一步”按钮进行交互。

以下是来自该站点的按钮 html 的 sn-p:

<a class="x-btn attached-btn blue x-unselectable x-box-item x-btn-attached-btn-small x-item-disabled x-btn-disabled" style="height: 40px; right: auto; left: 282px; top: 0px; margin: 0px;" hidefocus="on" unselectable="on" role="button" aria-hidden="false" aria-disabled="true" id="button-1021" data-componentid="button-1021">
    <span id="button-1021-btnWrap" data-ref="btnWrap" role="presentation" unselectable="on" style="" class="x-btn-wrap x-btn-wrap-attached-btn-small ">
        <span id="button-1021-btnEl" data-ref="btnEl" role="presentation" unselectable="on" style="height:auto;" class="x-btn-button x-btn-button-attached-btn-small x-btn-text    x-btn-button-center ">
            <span id="button-1021-btnIconEl" data-ref="btnIconEl" role="presentation" unselectable="on" class="x-btn-icon-el x-btn-icon-el-attached-btn-small  " style=""></span>
            <span id="button-1021-btnInnerEl" data-ref="btnInnerEl" unselectable="on" class="x-btn-inner x-btn-inner-attached-btn-small">next</span>
        </span>
    </span>
</a>

我尝试过使用类名、id 和 css 选择器,但到目前为止还没有成功。下面是python sn-p:

def exe(self):
    browser = webdriver.Firefox()
    wait = WebDriverWait(browser, 15)
    yesterday = date.today() - timedelta(1)
    browser.get("https://ssp.vertamedia.com")

    try:
        userElement = wait.until(EC.visibility_of_element_located((By.ID,'textfield-1020-inputEl')))
        userElement.send_keys(self.cred.pop('User'))
        browser.find_element_by_id('button-1021').click()
        passElement = wait.until(EC.visibility_of_element_located((By.ID, 'textfield-1027-inputEl')))
        passElement.send_keys(self.cred.pop('Password'))
        browser.find_element_by_id('button-1028').click()

    except TimeoutException:
        self.cred['Impression'] = "Login error"
        self.cred['Revenue'] = "Login error"
        self.cred['Date'] = yesterday.strftime('%m%d%y')

基本上当它点击我输入密码的 passElement 部分时,它会遇到“元素不可见”错误。

任何关于如何让它与下一个按钮交互的建议将不胜感激!

【问题讨论】:

  • 设置用户名后有没有试过多睡一会儿?

标签: python html css selenium


【解决方案1】:

您应该避免使用 time.sleep(),并使用 WebDriverWait 让您等待特定条件发生后再继续:

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

def exe():
    browser = webdriver.Firefox()
    wait    = WebDriverWait(driver, 10)
    browser.get("https://ssp.vertamedia.com")
    try:
        userElement = browser.find_element_by_id('textfield-1020-inputEl')
        userElement.send_keys(self.cred.pop('User'))
        browser.find_element_by_id('button-1021').click()
        passElement = wait.until(EC.visibility_of_element_located((By.ID,'textfield-1027-inputEl'))
        passElement.send_keys(self.cred.pop('Password'))
        browser.find_element_by_id('button-1028').click()
        time.sleep(10)  #Change this to WebDriverWait as well

您可以在此处了解有关 selenium 等待的更多信息:http://selenium-python.readthedocs.io/waits.html

【讨论】:

  • 感谢 SDBot,我很欣赏等待部分的链接,这改进了我设置的所有其他驱动程序。我现在发生的事情是超时。出于某种原因,它没有“点击”下一个按钮。示例用户名可以是 test@sample.com。我想知道除了 click() 是否有更好的方式与页面交互
  • @Andrew 问题还没有解决吗?您可以尝试使用 javascript click ex: browser.execute_script("document.getElementById('button-1028-btnInnerEl').click()") 并且您是否尝试过使用预期条件 element_to_be_clickable
  • 我尝试了 element_to_be_clickable 以及其他一些预期条件。我设法通过混合使用 wait() 和 time.sleep() 使其可靠地工作
【解决方案2】:

再次感谢 SDBot 对 wait() 的帮助。

对于这个特定的站点,发生了一些奇怪的事情,驱动程序无法判断“下一步”按钮是否可见并且可以点击。 “登录”按钮也会发生同样的事情。我设法通过在填写用户名和登录之间再次插入 time.sleep() 来使其工作。我尝试了几种不同的预期条件,但无法让它发挥作用。 http://selenium-python.readthedocs.io/api.html?highlight=expected%20conditions#selenium.webdriver.support.expected_conditions.frame_to_be_available_and_switch_to_it

def exe(self):
    browser = webdriver.Firefox()
    wait = WebDriverWait(browser, 15)
    yesterday = date.today() - timedelta(1)
    browser.get("https://ssp.vertamedia.com")

    try:
        userElement = wait.until(EC.visibility_of_element_located((By.ID,'textfield-1020-inputEl')))
        userElement.send_keys(self.cred.pop('User'))
        time.sleep(# insert seconds)
        wait.until(EC.visibility_of_element_located((By.ID,'button-1021-btnInnerEl'))).click()
        passElement = wait.until(EC.visibility_of_element_located((By.ID, 'textfield-1027-inputEl')))
        passElement.send_keys(self.cred.pop('Password'))
        time.sleep(# insert seconds5)
        wait.until(EC.visibility_of_element_located((By.ID,'button-1028'))).click()

    except TimeoutException:
        self.cred['Impression'] = "Login error"
        self.cred['Revenue'] = "Login error"
        self.cred['Date'] = yesterday.strftime('%m%d%y')

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2018-03-14
    • 2012-09-03
    • 2012-03-26
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多