Python WebDriver AttributeError:LoginPage实例没有属性' driver'

时间:2015-04-19 17:56:52

标签: python selenium selenium-webdriver

我已经阅读了一些有关Python Selenium Webdriver Page Object模型的教程,因为我必须使用Selenium和Python自动化gui测试。

首先,我正在尝试编写Login Page类和LoginMainTest类。我运行代码时收到以下错误。

AttributeError:LoginPage实例没有属性'driver'

我想我必须指定我实例化LoginPage的selenium驱动程序  例如在这一行log_in = LoginPage.LoginPage()

我需要一些帮助。

完整错误:

Traceback (most recent call last):
File "E:\Python projects\unitTest_sample - Modifying into Page Object\LoginMainTest.py", line 11, in test_valid_login
log_in = LoginPage.LoginPage()
File "E:\unitTest_sample - Modifying into Page Object\LoginPage.py", line 20, in __init__
emailFieldElement  = self.driver.find_element_by_id(self.emailFieldID)
AttributeError: LoginPage instance has no attribute 'driver'

我的LoginMainTest.py类如下:

import LoginPage
import unittest

class GoogleTest(unittest.TestCase):

  def test_valid_login(self):
    log_in = LoginPage.LoginPage()
    log_in.userLogin_valid()

if __name__ == '__main__':
unittest.main()

我的Login.py类如下:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 

class LoginPage():

Username            = "test1"
password            = "Test"
emailFieldID        = "email"
passFieldID         = "pass"
loginButtonXpath    = "//input[@value='log in']"
logo_xpath          = "//a[contains(@href, 'logo')])[1]"

def setup(self):
    self.driver = webdriver.Firefox()
    self.driver.get("http://www.testaaa.com")

def __init__(self):
    emailFieldElement  = self.driver.find_element_by_id(self.emailFieldID)
    passFieldElement   = self.driver. find_element_by_id(self.passFieldID)
    loginFieldElement  =  self.driver.find_element_by_xpath(self.loginButtonXpath)

def userLogin_valid(self):
    self.emailFieldElement.clear()
    self.emailFieldElement.send_keys(self.Username)
    self.passFieldElement.clear()
    self.send_keys(self.password)
    self.loginFieldElement.click()

def tearDown(self):
    self.driver.quit()

2 个答案:

答案 0 :(得分:1)

首先,您的设计存在缺陷。

您的脚本失败的原因是因为当您创建登录页面的对象时, init 会被调用,但它无法找到驱动程序,因为它是在setup fn中定义的(从未调用过)

理想情况下,在页面对象模型中,您应该在测试文件中初始化浏览器(驱动程序),然后在创建任何页面文件的对象时,您应该传递该驱动程序。

您的设置应该是这样的,

页面文件:

# setup() fn not needed here
.
.
def __init__(self, driver):
    self.driver = driver
    emailFieldElement  = self.driver.find_element_by_id(self.emailFieldID)
    passFieldElement   = self.driver. find_element_by_id(self.passFieldID)
    loginFieldElement  =  self.driver.find_element_by_xpath(self.loginButtonXpath)
.
# teardown() not needed here, should be in test file
.

测试文件:

.
.
    class GoogleTest(unittest.TestCase):

      def test_valid_login(self):
        self.driver = webdriver.Firefox()   # the first 2 stmts can be in a setupclass
        self.driver.get("http://www.testaaa.com")
        log_in = LoginPage.LoginPage(self.driver)
        log_in.userLogin_valid()
.
.

答案 1 :(得分:0)

由于Chrome浏览器版本和Chrome Webdriver版本之间不匹配,我每次都遇到这个问题。

因此,在从https://chromedriver.chromium.org/下载相应的ChromeDriver之前,请在您的Chrome浏览器中查看帮助>关于Google Chrome。

祝你好运!