代码之家  ›  专栏  ›  技术社区  ›  Northers

通过xpath查找元素在一个函数中运行良好,但在下一个非类型错误中不起作用

  •  0
  • Northers  · 技术社区  · 7 年前

    我试图弄明白为什么本质上同一行代码在一个函数中有效,但在另一个函数中无效。

    我有三个文件,如下所示。

    我的问题是,它运行default\u login()很好,对find\u element\u by\u xpath行没有问题,但随后无法运行log\u out()并在find\u element\u by\u xpath行弹出,出现以下错误:-

    AttributeError: 'NoneType' object has no attribute 'find_element_by_xpath'
    

    我可以在一个没有定义函数的文件中独立运行同一行,它可以找到没有问题的元素。

    当它运行tearDown()行self时,我也会得到相同(类似)的错误。驾驶员退出():-

    AttributeError: 'NoneType' object has no attribute 'quit'
    

    如果有人能告诉我为什么它会这样失败,我将不胜感激。我有各种各样的问题,像这样,并开始怀疑我是否有什么配置错误的地方。。。

    项目文件:-

    初始化。py公司

    from selenium import webdriver
    
    
    def start_webdriver():
        driver = webdriver.Chrome('C:\TEMP\chromedriver.exe')
        driver.maximize_window()
        return driver
    
    
    def start_browser(driver):
        driver.get("https://myURL")
        return driver
    

    登录。py公司

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ec
    
    
    def default_login(driver):
        wait = WebDriverWait(driver, 5)
        login_link = driver.find_element_by_xpath("//a[contains(@href, 'login')]")
        login_link.click()
    
        username_text_field = wait.until(ec.element_to_be_clickable((By.NAME, "email")))
        password_text_field = driver.find_element_by_name("password")
    
        username_text_field.send_keys("username")
        password_text_field.send_keys("password")
    
        login_button = driver.find_element_by_xpath("//*[@class='btn save btn-primary']")
        login_button.click()
    
    
    def log_out(driver):
        new_project = driver.find_element_by_xpath("//table[@id='my-projects-table']/tbody/tr/td[3]")
        new_project.click()
        logout_user = driver.find_element_by_class_name("dropdown-toggle")
        logout_user.click()
        logout_sign_out = driver.find_element_by_xpath("//a[contains(@href, 'logout')]")
        logout_sign_out.click()
        print("logged out")
    

    只是一个测试。py公司

    import unittest
    from Common import initialisation, login
    
    
    class RegisterPatientsTests(unittest.TestCase):
        def setUp(self):
            self.driver = initialisation.start_webdriver()
            self.driver = initialisation.start_browser(self.driver)
    
        def tearDown(self):
            self.driver.quit()
    
        def test_another_quick_test(self):
            self.driver = login.default_login(self.driver)
            self.driver = login.log_out(self.driver)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   hoefling    7 年前

    一个没有 return 语句本质上是一个具有 return None . 您的功能 login.default_login() 没有 回来 语句,从而返回 None . 然后 self.driver 被分配给 没有一个 :

    self.driver = login.default_login(self.driver)
    

    只需添加 return driver 登录。默认登录() login.log_out() 函数来修复这两个错误。