Selenium Webdriver没有点击元素

时间:2017-03-28 20:02:32

标签: python html css selenium

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

https://ssp.vertamedia.com/

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

使用此站点,webdriver需要输入用户名,然后在显示密码输入和提交按钮之前与“下一步”按钮进行交互。我能够填写用户名,但到目前为止还没能让webdriver与“下一步”按钮进行交互。

以下是网站上的按钮html片段:

<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 Selector并且到目前为止还没有成功。下面是python片段:

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部分时,它会遇到“Element is not visible”错误。

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

2 个答案:

答案 0 :(得分:0)

你应该避免使用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

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

答案 1 :(得分:0)

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

通过这个特定网站,发生了一些奇怪的事情,司机无法告诉他们下一个&#34;按钮可见并准备点击。同样的事情发生在&#34;登录&#34;按钮。我设法通过在填写用户名和登录之间再次插入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

public Polygon() {
    p = new ArrayList<>();
}