find_element_by_xpath在一个函数中工作正常,但在下一个函数中不正常 - 非类型错误

时间:2017-11-24 14:27:59

标签: python google-chrome selenium-webdriver attributeerror nonetype

我试图弄清楚为什么基本上同一行代码在一个函数中起作用,而在另一个函数中起作用。

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

我的问题是它运行default_login()并且没有find_element_by_xpath行的问题,但是然后无法运行log_out()并在find_element_by_xpath行炸出并出现以下错误: -

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

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

运行tearDown()行self.driver.quit()时,我也得到相同(类似)的错误: -

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

如果有人能告诉我为什么会这样失败,我会非常感激。我遇到了各种各样的问题,并开始怀疑我是否在某处配置了错误...

项目文件: -

initialisation.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

login.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")

just_a_test.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 个答案:

答案 0 :(得分:0)

没有return语句的函数本质上是return None的函数。您的函数login.default_login()没有return语句,因此返回None。然后将self.driver分配给None

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

只需将return driver添加到login.default_login()login.log_out()函数即可修复这两个错误。