本人在自学PO模式时遇见一个困扰本人近一个星期的问题,这是一段非常痛苦的经历,本人遇见了且在查阅多个资料下终于找到了问题的答案。这是一个关于'.'英文句点!!!的故事。
在本人被临时拉来学习软测中的‘自动化测试’、‘功能测试用例编写’和‘功能测试(找BUG)’时,在学自动化测试要求使用PO模式,根据‘CSDN’和‘小破站’找到的资料学习中有一个问题一直令人不解,程序写对了,该写的模块写完了,该导的自建包也导了,该导入的数据也导了,pycharm编辑器也没任何的错误反馈,测试运行就是一直报错‘ModuleNotFoundError: No module named ‘xxx‘‘。本人在这只说明本人遇到的,其它的类如‘ModuleNotFoundError: No module named ‘xxx‘可能的解决方案’本人并不写入,其他博主可能发过很多类似的。
在这本人自作多情的介绍一下本人目前理解的PO模式:‘PO层’指一个页面即一个对象,只要发生页面跳转,就要创建一个新的.py文件去写新的内容,但在写对象之前要把基础的‘Base层’写好,当你把基础的‘Base层’和对象的‘PO层’写好了就需要一个有运行逻辑的‘Test层’创建出来(注:上述这三层都在不同的软件包下,且这三个软件包都在同一个根目录包下)。
就在本人写完上述所说的所有内容时检查了也确定了没有问题就运行test*.py(注:‘test*’指的是test开头py文件)测试本人所写的程序代码 结……果……!!!程序报了一个错误‘ModuleNotFoundError: No module named ‘xxx‘’这是让我万万没想到的。
请看下图(本人鼠标手写的):
PO层的p1、p2和p3都继承了Base层的base,Test层的test都继承了PO层的p1、p2和p3,那么Test层的test间接性继承了Base层的base,可是正式因为Test层的test无法找到Base层的base所以产生了‘ModuleNotFoundError: No module named ‘xxx‘‘错误。
源码如下(注:有些许部分涉及到秘密内容,故被本人给删掉了!!!):
base.py
from selenium import webdriver
class Bp:
def __init__(self, driver):
self.driver = driver # type:webdriver
def openUrl(self, url):
self.driver.get(url)
def element(self, loc):
return self.driver.find_element(*loc)
p1.py
from selenium.webdriver.common.by import By
from .BasePage import Bp
import time
class Lp(Bp):
url = ''
user = By.ID, ''
pas = By.NAME, ''
cli = By.TAG_NAME, ''
def inpop(self, value):
self.element(self.user).send_keys(value)
def inpop1(self, value1):
self.element(self.pas).send_keys(value1)
def inpop2(self):
self.element(self.cli).click()
def lps(self, value1, value2): # 注:因程序运行太快了网页跟不上故加上了强制等待1秒
self.openUrl(self.url)
time.sleep(1)
self.inpop(value1)
time.sleep(1)
self.inpop1(value2)
time.sleep(1)
self.inpop2()
time.sleep(1)
p2.py
from selenium.webdriver.common.by import By
from .BasePage import Bp
import time
class Ap(Bp):
text = By.PARTIAL_LINK_TEXT, ''
ll = By.XPATH, ''
title = By.ID, ''
code = By.ID, ''
ls = By.XPATH, ''
def aptext(self):
self.element(self.text).click()
def apll(self):
self.element(self.ll).click()
def aptitle(self, value):
self.element(self.title).send_keys(value)
def apcode(self, value):
self.element(self.code).send_keys(value)
def apls(self):
self.element(self.ls).click()
def aps(self, value1, value2): # 注:因程序运行太快了网页跟不上故加上了强制等待1秒
self.aptext()
time.sleep(1)
self.apll()
time.sleep(1)
self.aptitle(value1)
time.sleep(1)
self.apcode(value2)
time.sleep(1)
self.apls()
time.sleep(1)
test.py
from selenium import webdriver
import unittest
import ddt
import time
import csv
from PoTest.Page.LoginPage import Lp
from PoTest.Page.AddPage import Ap
@ddt.ddt
class test(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
def tearDown(self) -> None:
self.driver.quit()
@ddt.data(*[i for i in csv.reader(open(r'', encoding='UTF-8'))])
@ddt.unpack
def test_date(self, name, code):
Lp(self.driver).lps(value1='student', value2='student')
time.sleep(1)
Ap(self.driver).aps(value1=name, value2=code)
time.sleep(1)
if __name__ == '__main__':
unittest.main()
观看以上代码程序想必细心的已经发现有什么不同了吧,对、没错、就是p1、p2导入base时加上的’.‘英文句点,不加的话本人确实看不出有什么问题,但是test却无法访问,所以才照成的报错。
关于英文句点的解释我个人看到的有三种:
第一种:在编程语言中,英文句点通常是属性访问符,在 python 中一切皆对象,句点用来访问对象的属性或者方法。
第二种:句点就是一个语法中的“的”,表达的是对象之间的从属关系。
第三种:英文句点通常是属性访问符,在 python 中一切皆对象,句点用来访问对象的属性或者方法。
我个人看法本文所写的更倾向于第二种!!!