很多新手小白对于程序执行报错,不知道怎么debug进行调试。我也是在学习中发现,这个问题比较有参考价值,因为大神对于这种问题都不屑一看。
因此有相同问题的小伙伴可以看看我这篇文章,参考一下思路。
代码程序要实现效果:
测试用例一共2条case,错误的和正确的:
·输入错误用户名、密码,登录,弹出提示,验证提示语正确
·输入正确用户名、密码,登录,登录成功,验证标题正确
1.0版本源代码
#导入相关包 from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep, time from selenium import webdriver import pytest from page.BasePage import BasePage from page.user_login_page import Test_admin_login_page from Util import util #类名称 class TestUserLogin(object): #初始化函数 def setup_class(self): self.driver=webdriver.Chrome() self.adminpage= Test_admin_login_page(self.driver) self.adminpage.goto_admin_page() self.logger=util.get_logger() self.logger.info('登录功能') #配置参数 login_data=[('wangxin1','123456','账号或密码不正确'), ('wangxin', '123', '卡车调度系统') ] #pytest 调用参数 @pytest.mark.dependency(name=login_data) @pytest.mark.parametrize('username,pwd,expect',login_data) #实现登录功能 def test_user_logon_username_pass(self,username,pwd,expect): self.logger.debug('输入用户名称:%s ', username) self.adminpage.input_username(username) self.logger.debug('输入密码:%s',pwd) self.adminpage.input_pwd(pwd) self.logger.debug('点击登录') self.adminpage.input_btn() #作判断 if username =='wangxin1': WebDriverWait(self.driver,5).until(EC.alert_is_present()) time.sleep(2) alert=self.driver.switch_to.alert time.sleep(2) assert alert.text==expect alert.accept() time.sleep(2) else: WebDriverWait(self.driver,5).until(EC.title_is(expect)) sleep(3) assert self.driver.title==expect self.driver.quit() #调用 if __name__ == '__main__': pytest.main()
运行成功后提示如下:
实际运行效果是用例都执行了,但是就是结果显示failed。
于是在感觉出问题的if语句处加了一下断点,一步步调试,点击下面箭头指的下一步。
执行过程种发现执行if语句后直接转到else语句后面,证明alert语句没执行成功。
为什么没执行成功呢?发现提示语是一个message而非alert。那有没有可能这块写错了呢?于是重新改写将提示语定位。
WebDriverWait(self.driver,5).until(EC.visibility_of_element_located(toast)) sleep(3) msg=self.driver.find_element(*toast).text assert msg == expect
运行报错:
说明运行WebDriver wait等待5s钟后没有定位到元素报异常。时间调长一点再调试,仍然报错,其实就是元素未定位到。
将css定位改为xpah定位,再次运行成功。
WebDriverWait(self.driver,5).until(EC.visibility_of_element_located(toast)) msg=self.driver.find_element(*toast).text sleep(2) assert msg == expect
2.0版本代码
#导入相关包 from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep, time from selenium import webdriver import pytest from page.BasePage import BasePage from page.user_login_page import Test_admin_login_page from Util import util #类名称 class TestUserLogin(object): #初始化函数 def setup_class(self): self.driver=webdriver.Chrome() self.adminpage= Test_admin_login_page(self.driver) self.adminpage.goto_admin_page() self.logger=util.get_logger() self.logger.info('登录功能') #配置参数 login_data=[('wangxin1','123456','账号或密码不正确'), ('wangxin', '123', '卡车调度系统') ] #pytest 调用参数 @pytest.mark.dependency(name=login_data) @pytest.mark.parametrize('username,pwd,expect',login_data) #实现登录功能 def test_user_logon_username_pass(self,username,pwd,expect): self.logger.debug('输入用户名称:%s ', username) self.adminpage.input_username(username) self.logger.debug('输入密码:%s',pwd) self.adminpage.input_pwd(pwd) self.logger.debug('点击登录') self.adminpage.input_btn() #作判断 if username =='wangxin1': WebDriverWait(self.driver,5).until(EC.visibility_of_element_located(toast)) msg=self.driver.find_element(*toast).text sleep(2) assert msg == expect else: WebDriverWait(self.driver,5).until(EC.title_is(expect)) sleep(3) assert self.driver.title==expect self.driver.quit() if __name__ == '__main__': pytest.main()
总结
回顾下刚刚写完代码报错却不知道怎么解决的话,处理办法总结如下:
·能定位到某个语句的报错,可以看报错信息;
·如果没有报错信息,或者报错信息不能区分,Debug运行调试;
·Debug调试,应该走的语句没走就能定位这块有问题,比如上面就是提示语提醒我给当作alert定位造成没有定位到。
作者:桃子