Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium Python:我的代码中有哪些错误?_Python_Selenium_Selenium Webdriver_Webdriver - Fatal编程技术网

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

Selenium Python:我的代码中有哪些错误?,python,selenium,selenium-webdriver,webdriver,Python,Selenium,Selenium Webdriver,Webdriver,我想知道为什么这段代码会打开mozilla两次,为什么它在完成时不关闭它。此外,我不完全理解为什么login是一个带有函数的类,而不是一个直接的函数 > import unittest from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC c

我想知道为什么这段代码会打开mozilla两次,为什么它在完成时不关闭它。此外,我不完全理解为什么login是一个带有函数的类,而不是一个直接的函数

> 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()
多谢各位

这是因为您实例化了webdriver两次,一次在
TestCase
中,一次在
LoginDetails
类中

为什么另一个答案不完全正确 在这种情况下,WebDriver不应由
LoginDetails
类控制
LoginDetails
类非常接近于符号表示,因此,应该“从外部”为驱动程序提供。另外,在一个类中打开浏览器,在另一个类中关闭浏览器,这会使代码更接近

更好的解决方案 从
TestCase
类控制
webdriver
,并使用
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()
这是因为您实例化webdriver两次—一次在
TestCase
中,一次在
LoginDetails
类中

为什么另一个答案不完全正确 在这种情况下,WebDriver不应由
LoginDetails
类控制
LoginDetails
类非常接近于符号表示,因此,应该“从外部”为驱动程序提供。另外,在一个类中打开浏览器,在另一个类中关闭浏览器,这会使代码更接近

更好的解决方案 从
TestCase
类控制
webdriver
,并使用
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()
Firefox打开两次 在您的测试中,
self.ld=LoginDetails()
运行
LoginDetails()
函数,该函数依次运行
webdriver.Firefox()。这就是为什么Firefox会打开两次

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

为什么
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()
Firefox打开两次 在您的测试中,
self.ld=LoginDetails()
运行
LoginDetails()
函数,该函数依次运行
webdriver.Firefox()。这就是为什么Firefox会打开两次

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

为什么
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()

我认为驱动程序不应该由
LoginDetails
类控制
LoginDetails
非常接近页面对象表示法,因此,应该“从外部”给驱动程序。另外,在一个类中打开浏览器,在另一个类中关闭浏览器,会使它接近“意大利面条”。在我看来,这取决于你想对这个类做什么。在您的解决方案中,您不需要类。登录详细信息也可以是一个函数。我试图回答为什么LoginDetails是一个类的问题。但是,您是对的,不应该在代码中的不同位置打开和关闭连接。我希望您不介意我在回答中包含该评论。
LoginDetails
对selenium有特殊意义吗?否则,从代码示例中可以看到,它是一个没有继承的新对象。你是对的,但是如果你想模仿一个页面对象,你应该给驱动程序“来自外部”。谢谢你的反馈和修改。我喜欢这里有两种不同的解决方案供OP选择。非常感谢大家,它对我非常有用,特别是因为我能够完全理解它的工作原理。谢谢你和我分享你的知识,你太棒了。我认为驱动程序不应该被
LoginDetails
类控制
LoginDetails
非常接近页面对象表示法,因此,应该“从外部”给驱动程序。另外,在一个类中打开浏览器,在另一个类中关闭浏览器,会使它接近“意大利面条”。在我看来,这取决于你想对这个类做什么。在您的解决方案中,您不需要类。登录详细信息也可以是一个函数。我试图回答为什么LoginDetails是一个类的问题。但是,您是对的,不应该在代码中的不同位置打开和关闭连接。我希望您不介意我在回答中包含该评论。
LoginDetails
对selenium有特殊意义吗?否则,从代码示例中可以看到,它是一个没有继承的新对象。你是对的,但是如果你想模仿一个页面对象,你应该给驱动程序“来自外部”。谢谢你的反馈和修改。我喜欢这里有两种不同的解决方案供OP选择。非常感谢大家,我