Selenium Python:我的代码中有哪些错误?

时间:2016-09-02 18:35:27

标签: python selenium selenium-webdriver webdriver

我想知道为什么这段代码会两次打开mozilla,以及为什么它在完成时不会关闭它。此外,我不明白100%为什么登录是一个具有功能的类,而不是直接的功能。

> import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginDetails(object): 
    def __init__ (self):
        self.driver = webdriver.Firefox()

    def logindetails(self, username, password):
        driver = self.driver
        driver.maximize_window()
        driver.get("https://miclaro.claro.com.ar/")

        driver.implicitly_wait(30)

        driver.find_element_by_id("_58_login_movil").send_keys(username)

        driver.find_element_by_id("_58_password_movil").send_keys(password)

        driver.find_element_by_id("btn-home-login").click()


        # Login Success

class TestLogin(unittest.TestCase):

    def setUp(self):
        self.ld = LoginDetails()
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)

    def test_sr_Login(self):
        self.ld.logindetails("user", "pass")

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

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

非常感谢!

2 个答案:

答案 0 :(得分:3)

这是因为你实例化webdriver两次 - 一次在TestCase内,一次在LoginDetails类内。

为什么其他答案不完全正确

在这种情况下,WebDriver不应由LoginDetails类控制。 LoginDetails类非常接近Page Object符号表示,因此应该“从外部”给出驱动程序。另外,在一个类中打开浏览器并在另一个类中关闭它会使代码接近"Spaghetti"

更好的解决方案

webdriver班级控制TestCase,使用LoginDetails控制“分享”:

import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginDetails(object): 
    def __init__ (self, driver):
        self.driver = driver

    def logindetails(self, username, password):
        driver = self.driver
        driver.maximize_window()
        driver.get("https://miclaro.claro.com.ar/")

        driver.implicitly_wait(30)

        driver.find_element_by_id("_58_login_movil").send_keys(username)

        driver.find_element_by_id("_58_password_movil").send_keys(password)

        driver.find_element_by_id("btn-home-login").click()


class TestLogin(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.ld = LoginDetails(self.driver)

    def test_sr_Login(self):
        self.ld.logindetails("user", "pass")

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

答案 1 :(得分:2)

Firefox打开两次

在您的测试self.ld = LoginDetails()中运行__init__的{​​{1}}函数,然后运行LoginDetails(),然后在测试用例的下一行中发出相同内容。这就是Firefox打开两次的原因。

Firefox无法关闭

出于与上述相同的原因,Firefox未关闭。测试用例的webdriver.Firefox()仅关闭测试用例本身中定义的tearDown实例,而不是通过类的webdriver.Firefox()函数打开的实例。

为什么__init__是一个类

在这种情况下,

LoginDetails是一个在整个代码中保持LoginDetails持久性的类。如果它是一个函数,那么每次运行该函数时都会打开一个Firefox会话。除非您在函数外部指定webdriver.Firefox(),然后将其传递给函数。

更正代码

以下代码使用类功能:

webdriver.Firefox()