前言:自动化测试存在比较多的使用限制,会存在某段时间无法使用的生疏期。通过这篇文章记录项目编写程序中遇到的问题以及解决思路,希望对以后的自动化开发能有些帮助。
本篇记录5个问题:
问题6:获取列表中,整行整列数据的方法
问题7:数据无法获取众多原因之一:列表中同一位置元素,html格式不同。
问题8:for循环与try使用错误
问题9:确认网页是否打开的方法之一:使用title
问题10:selenium操作下拉选项内容
问题6:获取列表中,整合整理额数据的方法:
操作网页中,经常会出现列表,如果使用selenium获取一个列表的所有数据。目前可行的方法核心是For循环+Xpath路径。
1. 获取整个表单tbody的xpath路径:list = driver.find_element_by_xpath("//*[@id="***"]/tbody")
2. 获取有效数据第一行,第一列的数据: test_click = list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[1]/td[1]/b")。这一步实际上可以不应用list,引用list能够将范围缩小到特定的列表。如果页面只有一个列表,则不需要获取list
3. 获取有效数据第二行,第一列的数据:test_click2 = list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[2]/td[1]/b")
4. 获取有效数据第一行,第二列的数据:test_click3 = list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[1]/td[2]/b")
按照规律,如果想要获取某个特定列的数据则:
test_list = []
for i in range(1,最大列个数):
test_list.append(list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[{}]/td[1]/b".format(i)))
取特定行也类似。
问题7:数据无法获取众多原因之一:列表中同一位置元素,html格式不同。
html页面中部分字段由于显示内容不同,html中的名称内容也不同。selenium如果不做处理,就会导致程序运行到某一步因找不到元素而报错。NoSuchElementException。处理这种问题,常用 异常处理【 try,except,else,final】
try: //某个字段可能由于内容不同导致html格式不同,无法使用同一个xpath获取到 Status = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/b'%count).text except NoSuchElementException: //取不到字段的时候,就开始运行另一种形式 Status = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/font/b/b' % count) count_parren = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/'% count).text count = re.search('\(\d\)', count_parren).group() final: driver.quit() //最后退出浏览器
问题8:for循环与try使用错误
主要是对try使用方法的不理解,导致的问题。
try:当执行其中的方法出现错误后,就会直接跳出try中的代码。相当于发现报错,就执行了break。所以当try中写入了for循环后,任何一次执行内容出现了异常,都会跳出整个for循环。
解决方法也很简单,值需要将try写到for循环中。
for count in range(1,len(Application_List)+1): try: Applation = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[1]/b'%count).text except NoSuchElementException: break
问题9:确认网页是否打开的方法之一:使用title
有个自动化需求的描述是,访问地址判断服务是否启动。接到需求的时候,考虑捕捉该网址特定的字段,能够捕捉到就算启动了。这种方案的问题在于,每个页面的内容不一致,每个都需要写,很要命。所以就想有没有一个所有页面都使用但是内容还各不相同的用于区别页面以及验证是否启动。这个时候就先到了,Title
selenium中也有取title的方法:driver.title
开发内容就分为了两步:第一步,根据提供的地址获取title,写入配置文件中。
第一步,只是取title的过程用自动化执行了,然后打印出title,复制粘贴到excel里。当然也可以直接写入excle,就是比较麻烦,一次性完成的内容,还是手动操作能快些。
第二部,实际测试的时候,取title与配置文件中的比较。
for Key, Value in URL_Dict.items(): # 验证内容正确性 driver = browser_config['chrome']() uihandle = UIHandle(driver) try: uihandle.get(Value[0]) sleep(2) # 获取登陆页面的Title信息 Server_Title = driver.title # 获取的Title与config中的title比较,如果不同,则说明页面没启动 if Server_Title == Value[1]: # print("{Key}:{url} 已经启动".format(Key = Key, url = Value[0])) self.TestReport['Total_Success'] += 1 else: print('*'* 50) print("{Key}:{url} 环境未启动".format(Key = Key, url = Value[0])) self.TestReport['Total_Failures'] += 1 self.TestReport["Error_Report"].append("""{Key}:{url} 该地址未完成启动 """.format(Key=Key, url=Value[0])) except InvalidArgumentException: self.TestReport["Error_Report"].append("""{Key}:{url} 该地址无法访问 """.format(Key = Key, url = Value[0])) self.TestReport['Total_Failures'] += 1 finally: driver.quit()
问题10:selenium操作下拉选项内容
UI自动化经常会需要点击一些下拉选项。目前可行的方法是,先获取控件位置以及选项位置。然后先点击控件再点击选项。就能够完成选项选择
uihandle.Click("前端", '性别选型') uihandle.Click("前端", '男')