2016-09-02 29 views
0

我想知道爲什麼這個代碼打開兩次Mozilla,以及爲什麼它不完成時關閉它。此外,我不明白爲什麼登錄是一個具有函數的類,而不是直接函數。硒Python:我的代碼中有哪些錯誤?

> 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

這是因爲你實例化webdriver兩次 - 一次在TestCase裏面,一次在LoginDetails類裏面。

爲什麼對方的回答是不完全正確

的webdriver的不應該由在這種情況下LoginDetails類進行控制。 LoginDetails班級非常接近Page Object表示法,因此應該從外部給司機。另外,在一個類中打開瀏覽器並在另一個類中關閉瀏覽器會使代碼接近"Spaghetti"

更好的解決方案

控制從TestCase級和 「共享」 與LoginDetailswebdriver

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() 
2

火狐打開兩次

在您的測試self.ld = LoginDetails()運行的LoginDetails()__init__功能,然後運行webdriver.Firefox(),然後在測試用例的下一行中發出相同的結果。這就是Firefox打開兩次的原因。

Firefox不關閉

由於與上述相同的原因,Firefox未關閉。測試用例的tearDown只關閉在測試用例本身定義的webdriver.Firefox()實例,而不是通過該類的__init__功能打開的實例。

爲什麼LoginDetails是一類

LoginDetails在這種情況下,一類以保持webdriver.Firefox()持續整個代碼。如果它是一個函數,那麼每次運行函數時都會打開一個Firefox會話。除非您在函數外部指定webdriver.Firefox(),然後將其傳遞給該函數。

更正後的代碼

下面的代碼使用類功能:

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() 
     self.driver.implicitly_wait(30) 

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

     self.driver.implicitly_wait(30) 

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

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

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

    def __del__(self): 
     ''' ADDED based on comment by alecxe ''' 
     self.driver.close() 

class TestLogin(unittest.TestCase): 

    def setUp(self): 
     self.ld = LoginDetails() 

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

    def tearDown(self): 
     # driver is closed by LoginDetails 
     pass 

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

我覺得司機不應該由'LoginDetails'類進行控制。 'LoginDetails'非常接近頁面對象表示法,因此應該從外部給予驅動程序。另外,在一個課程中打開瀏覽器並關閉另一個課程將使其接近「意大利麪條」。 – alecxe

+0

在我看來,這取決於你想要對班級做什麼。在你的解決方案中,你不需要上課。登錄詳細信息也可以是一個函數。我試圖回答爲什麼LoginDetails是一個類的問題。你是對的,但不應該在代碼中的不同位置打開和關閉連接。我希望你不要介意我在我的回答中包含這個評論。 – Ascurion

+0

「LoginDetails」與硒有什麼特別的含義?否則,從我在代碼示例中可以看到的是沒有繼承的新對象。你是對的,但如果你想像一個頁面對象,你應該給司機「從外面」。 – Ascurion