from selenium import webdriver import time driver = webdriver.Chrome(executable_path="D:\\work\\learn_to_old\\driver\\chromedriver.exe") driver.get("https://www.baidu.com") time.sleep(3) driver.find_element_by_id("kw").send_keys("银魂") driver.find_element_by_id("su").click() time.sleep(3) # print(driver.page_source) # 判断搜索结果在不在页面中,可以用assert,也可以自己写if语句判断 if "空知英秋" in driver.page_source: print("success") else: print("fail") driver.quit()
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver import time def search_something(): driver = webdriver.Chrome(executable_path="D:\\work\\learn_to_old\\driver\\chromedriver.exe") driver.get("https://www.baidu.com") time.sleep(3) driver.find_element_by_id("kw").send_keys("银魂") driver.find_element_by_id("su").click() time.sleep(3) source = driver.page_source if "空知英秋" in source: print("success") else: print("fial") driver.quit() search_something()
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver import time num = 0 fail_num = 0 suc_num = 0 def search_something(keyword, words): driver = webdriver.Chrome(executable_path="D:\\work\\learn_to_old\\driver\\chromedriver.exe") driver.get("https://www.baidu.com") time.sleep(3) driver.find_element_by_id("kw").send_keys(keyword) driver.find_element_by_id("su").click() time.sleep(3) global num, fail_num, suc_num num += 1 source = driver.page_source if words in source: print(f"搜索{keyword}成功") suc_num += 1 else: print(f"搜索{keyword}失败") fail_num += 1 driver.quit() data_list = [["银魂", "空知英秋"],["kali", "Kali Linux"], ["centos", "Red Hat"]] for i in range(len(data_list)): search_something(data_list[i][0], data_list[i][1]) print(f"共执行{num}条用例,成功{suc_num}条,失败{fail_num}条")
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver import time import unittest from ddt import ddt,data,unpack @ddt class my_search(unittest.TestCase): def setUp(self): global num, fail_num, suc_num num = 0 fail_num = 0 suc_num = 0 # data_list = [["银魂", "空知英秋"],["kali", "Kali Linux"], ["centos", "Red Hat"]] # 注意,这边传的各组参数要单独拿开(如下),如果跟上面这样传list,ddt会认为是一组参数, # 比如@data(data_list) # 需要注意的是,每次执行一组数据,整个类是重复执行一遍的,相当于循环执行这个类 @data(["银魂", "空知英秋"],["kali", "Kali Linux"], ["centos", "Red Hat"]) @unpack def test_search(self, keyword, words): self.driver = webdriver.Chrome(executable_path="D:\\work\\learn_to_old\\driver\\chromedriver.exe") self.driver.get("https://www.baidu.com") time.sleep(3) self.driver.find_element_by_id("kw").send_keys(keyword) self.driver.find_element_by_id("su").click() time.sleep(3) global num, fail_num, suc_num num += 1 source = self.driver.page_source if words in source: print(f"搜索{keyword}成功") suc_num += 1 else: print(f"搜索{keyword}失败") fail_num += 1 def tearDown(self): self.driver.quit() print(f"本次共执行{num}条用例,成功{suc_num}条,失败{fail_num}条") if __name__ == "__main__": unittest.main()
(因为与大部分与for循环一样,这里只贴更改的部分)
# with open(file_path,"r") as f 打开某个文件,并读取,“r“表示读取,”w"表示写入,‘rb‘表示读二进制文件,如图片等 # 切记:先将文本设置为utf-8,在复制中文进去,然后open要用encoding with open("step3_data.txt", "r", encoding="utf-8") as f: lines = f.readlines() print(lines) for line in lines: print(line.strip()) # strip() 去掉字符串末尾的\n print(line.strip().split(",")) # 切片,用“,”来将字符串切成list keyword_list = line.strip().split(",") search_something(keyword_list[0], keyword_list[1]) print(f"共执行{num}条用例,成功{suc_num}条,失败{fail_num}条")
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver import time import sys driver = None num = 0 fail_num = 0 suc_num = 0 def choose_driver(driver_name): global driver if driver_name == "ie": # 注意if判断语句要用== driver = webdriver.Ie(executable_path="D:\\work\\learn_to_old\\driver\\IEDriverServer.exe") elif driver_name == "chrome": driver = webdriver.Chrome(executable_path="D:\\work\\learn_to_old\\driver\\chromedriver.exe") elif driver_name == "firefox": driver = webdriver.Firefox(executable_path="D:\\work\\learn_to_old\\driver\\firefox.exe") else: print("选择的浏览器驱动有误,请重新选择!") sys.exit() def open_url(url): global driver driver.get(url) def send_keywords(find_way, ele, keyword): ele = find_ele(find_way, ele) ele.send_keys(keyword) def click(find_way, ele): ele = find_ele(find_way, ele) ele.click() def sleep(sleep_seconds): time.sleep(int(sleep_seconds)) # 封装元素查找方法,如果想获取list,则用find_elements_by_name之类 # 也可以用js来定位 driver.execute_script("document.getElementById(‘username‘)") def find_ele(find_way, ele): global driver if find_way == "id": ele = driver.find_element_by_id(ele) # find_str = find_element_by_id elif find_way == "name": ele = driver.find_element_by_name(ele) elif find_way == "xpath": ele = driver.find_element_by_xpath(ele) elif find_way == "link_text": ele = driver.find_element_by_link_text(ele) elif find_way == "partial_link_text": ele = driver.find_element_by_partial_link_text(ele) elif find_way == "tag_name": ele = driver.find_element_by_tag_name(ele) elif find_way == "class_name": ele = driver.find_element_by_class_name(ele) elif find_way == "css_selector": ele = driver.find_element_by_css_selector(ele) else: print("元素查找方式有误,请修正!") sys.exit() return ele def my_assert(words): global driver, num, suc_num, fail_num num += 1 source = driver.page_source if words in source: print(f"搜索{words}成功") suc_num += 1 else: print(f"搜索{words}失败") fail_num += 1 def quit(): global driver driver.quit() # 2、使用步骤 # with open(file_path,"r") as f 打开某个文件,并读取,“r“表示读取,”w"表示写入,‘rb‘表示读二进制文件,如图片等 # 切记:先将文本设置为utf-8,在复制中文进去,然后open要用encoding # 有两种方法可以将["open","xxx"]组装成‘open("xxx")‘ # 1、先定义模板str,使用replace()函数替换即可 # 2、直接使用格式化字符串方式替换,这里使用的是f"eeee{xxx}",其他%s或者format也可以,参考订阅号上次发布的文章 with open("step4_steps.txt", "r", encoding="utf-8") as f: lines = f.readlines() # strs = "do_something()" 暂时不用此方法 for line in lines: # print(type(line)) # 根据line.count(‘|‘)来判断,步骤可以更加简化 if "|" in line: eval_str_list = line.strip().split("|") # print("===========",eval_str_list) if len(eval_str_list) == 2: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘)" elif len(eval_str_list) == 3: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘)" elif len(eval_str_list) == 4: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘, ‘{eval_str_list[3]}‘)" elif len(eval_str_list) == 5: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘, ‘{eval_str_list[3]}‘, ‘{eval_str_list[4]}‘)" elif len(eval_str_list) == 6: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘, ‘{eval_str_list[3]}‘, ‘{eval_str_list[4]}‘, ‘{eval_str_list[5]}‘)" else: print("过长,需要优化程序") print(eval_str_list,"*"*50) print(eval_str) eval(eval_str) else: # eval_str = strs.replace("do_something",line.strip()) eval_str = f"{line.strip()}()" print(eval_str) eval(eval_str) print(f"共执行{num}条用例,成功{suc_num}条,失败{fail_num}条")
choose_driver|chrome open_url|https://www.baidu.com sleep|3 send_keywords|class_name|s_ipt|银魂 click|xpath|//*[@id="su"] sleep|3 my_assert|空知英秋 quit
def read_file_to_line(file_path): with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() return lines test_datas = read_file_to_line("step5_data.txt") #读取测试数据 for test_data in test_datas: test_data = eval(test_data) # 将字符串转换为json,就不需要json.dump啥的了 test_steps = read_file_to_line("step5_steps.txt") # 读取测试步骤 for test_step in test_steps: # 找到关键字“{{”,替换数据 if "${" in test_step: # print("#"*10,type(test_step)) # 使用正则找到变量,$前面要加\,即便是字符串前用了r key = re.search(r"\${(.*?)}", test_step).group(1) # print("==== key ======",key) # {{key}} value step 替换数据 test_step = re.sub(r"\${%s}" %key, test_data[key], test_step) # print("#"*10,test_step) # print(type(test_step)) # 根据line.count(‘|‘)来判断,步骤可以更加简化 if "|" in test_step: eval_str_list = test_step.strip().split("|") # print("===========",eval_str_list) if len(eval_str_list) == 2: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘)" elif len(eval_str_list) == 3: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘)" elif len(eval_str_list) == 4: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘, ‘{eval_str_list[3]}‘)" elif len(eval_str_list) == 5: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘, ‘{eval_str_list[3]}‘, ‘{eval_str_list[4]}‘)" elif len(eval_str_list) == 6: eval_str = f"{eval_str_list[0]}(‘{eval_str_list[1]}‘, ‘{eval_str_list[2]}‘, ‘{eval_str_list[3]}‘, ‘{eval_str_list[4]}‘, ‘{eval_str_list[5]}‘)" else: print("过长,需要优化程序") print(eval_str_list,"*"*50) else: # eval_str = strs.replace("do_something",test_step.strip()) eval_str = f"{test_step.strip()}()" print(eval_str) # 异常处理 try: eval(eval_str) except Exception as e: print(f"{e}") print(f"共执行{num}条用例,成功{suc_num}条,失败{fail_num}条")
choose_driver|chrome open_url|https://www.baidu.com sleep|3 send_keywords|class_name|s_ipt|${keyword} click|xpath|//*[@id="su"] sleep|3 my_assert|${assert_words} quit
数据:
{"keyword":"银魂", "assert_words":"空知英秋"} {"keyword":"kali", "assert_words":"Kali Linux"} {"keyword":"centos", "assert_words":"Red Hat"}
执行:
原文:https://www.cnblogs.com/mikasama/p/12692476.html