二次开发的Selenium Demo版本
1 文件名你们自己命名就好,至于为什么要重写强制位移的函数呢,是因为Mac上Selenium不支持拖拽,只能这样做了,4个文件
----------------------------------------------------------------------------------------------
def login(auto): 2 """ 3 遍历上方login_config 4 按照其格式进行自动化操作 5 """ 6 for item in login_config: 7 for key, value in item.items(): 8 try: 9 # 把auto与key组合起来并传入value执行 10 # 如auto.refresh(2) 11 getattr(auto, key)(value) 12 except Exception as error: 13 print(error) 14 def Test(auto): 15 """ 16 遍历上方login_config 17 按照其格式进行自动化操作 18 """ 19 for item in Test_config: 20 for key, value in item.items(): 21 try: 22 # 把auto与key组合起来并传入value执行 23 # 如auto.refresh(2) 24 getattr(auto, key)(value) 25 except Exception as error: 26 print(error)
----------------------------------------------------------------------------------------------
# 拖动单行文本 Test1_config = [ {"drag_and_drop": ["//*[@id=\"root\"]/div/div/div[4]/div/div/div", "/html/body/div/div/div[2]/div[3]/div[1]/div[1]/div/div[1]", 2]}, {"clear_xpath": ["//*[@id='root']/div/div[2]/div[3]/div[2]/div/div[3]/div[1]/div[6]/div[2]/span/span/span[1]/input", 2]}, {"write_in_xpath": [ "//*[@id='root']/div/div[2]/div[3]/div[2]/div/div[3]/div[1]/div[6]/div[2]/span/span/span[1]/input", "supplier", 2]}, {"click_xpath": ["//*[@id='root']/div/div[2]/div[3]/div[2]/div/div[3]/div[1]/div[7]/span", 2]}, {"write_in_xpath": ["//*[@id='root']/div/div[2]/div[3]/div[2]/div/div[3]/div[1]/div[7]/span/input", "supplier_name", 2]} ] # 拖动多行文本 Test2_config = [ {"drag_and_drop1": ["//*[@id='root']/div/div[1]/div[4]/div[2]/div/div", "/html/body/div/div/div[2]/div[3]/div[1]/div[1]/div/div[1]", 2]}, {"clear_xpath": [ "//span[@class='ant-input-wrapper ant-input-group']//input[@class='ant-input' and @value='Multi-line Text']", 2]}, {"write_in_xpath": [ "//span[@class='ant-input-wrapper ant-input-group']//input[@class='ant-input' and @value='Multi-line Text']", "Notes", 2]}, {"click_xpath": ["//div[@class='bg-c-nodeproperties']/span[@class='ant-input-affix-wrapper", 2]}, {"write_in_xpath": ["//div[@class='bg-c-nodeproperties']/span[@class='ant-input-affix-wrapper']/input", "supplier_notes", 2]} ]
----------------------------------------------------------------------------------------------
import sys from selenium import webdriver from time import sleep from datetime import datetime from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver import ActionChains from selenium.common.exceptions import UnexpectedAlertPresentException from selenium.webdriver.common.action_chains import ActionChains import pyautogui # 重写的强制的位移函数 def move_mouse_to_element(driver, target_element): element_y_offset = int(target_element.location.get("y")) element_x_offset = int(target_element.location.get("x")) element_width = int(target_element.size.get("width")) element_height = int(target_element.size.get("height")) inner_height = int(driver.execute_script("return innerHeight")) screen_height = int(driver.execute_script("return outerHeight")) window_height = int(driver.execute_script("return window.screenY")) pyautogui.moveTo(element_x_offset + element_width / 2, element_y_offset + screen_height - inner_height - window_height + element_height / 2 + 500, duration=0.5) return target_element # 重写的强制位移的第二个函数 def move_mouse_to_element1(driver, target_element): element_y_offset = int(target_element.location.get("y")) element_x_offset = int(target_element.location.get("x")) element_width = int(target_element.size.get("width")) element_height = int(target_element.size.get("height")) inner_height = int(driver.execute_script("return innerHeight")) screen_height = int(driver.execute_script("return outerHeight")) window_height = int(driver.execute_script("return window.screenY")) pyautogui.moveTo(element_x_offset + element_width / 2 + 100, element_y_offset + screen_height - inner_height - window_height + element_height / 2, duration=0.5) return target_element # 和第一个位移函数配套用的 def drag_and_drop(driver, action, source, target): move_mouse_to_element(driver, target) action.drag_and_drop(source, target).perform() # 和第二个位移函数配套用的 def drag_and_drop1(driver, action, source, target): move_mouse_to_element1(driver, target) action.drag_and_drop(source, target).perform() # 输出的Log def write_finish_info(func): # @wraps(func) def wrapper(self, *args): func(self, *args) now = datetime.now().strftime("%X") name = "log_{}.txt".format('1') log = "[{}] 当前执行步骤为{}:{} {}\n".format(now, step, func.__name__, args) sys.stdout.write("[{}] 当前执行步骤为:{} {}\n".format(now, func.__name__, args)) with open(name, "a+") as f: f.write(log) return wrapper # 自动化所有用到的方法 class AutoTest: """ 自动化测试的主要脚本 所有行为在此类中编写 具体的操作及操作值,由配置表控制 """ def __init__(self, driver): self.driver = driver self.action = ActionChains(driver) @write_finish_info def get_url(self, entry): """ 打开网页的方法 传入必须为列表list,会检测list长度是否2 如若不为list或长度不对,则中断后续操作 若不想中断,则把raise ValueError("get_url gets a wrong value")改为return即可 """ if not isinstance(entry, list) and len(entry) != 2: raise ValueError("get_url gets a wrong value") url, s = tuple(entry) self.driver.get(url) sleep(s) @write_finish_info def maximize_window(self, s): sleep(s) self.driver.maximize_window() @write_finish_info def write_in_xpath(self, entry): """ 在xpath写入值的方法 传入必须为list,会检测list长度是否为3 """ if not isinstance(entry, list) and len(entry) != 3: raise ValueError("write_in_xpath gets a wrong value") xpath, words, s = tuple(entry) try: self.driver.find_element_by_xpath(xpath).send_keys(words) except Exception as e: print(e.error) sleep(s) @write_finish_info def write_in_id(self, entry): """ 在id写入值的方法 传入必须为list,会检测list长度是否为3 """ if not isinstance(entry, list) and len(entry) != 3: raise ValueError("write_in_id gets a wrong value") id, words, s = tuple(entry) self.driver.find_element_by_id(id).send_keys(words) sleep(s) @write_finish_info def click_xpath(self, entry): """ 点击xpath的方法 传入必须为list,会检测list长度是否为2 """ if not isinstance(entry, list) and len(entry) != 2: raise ValueError("click_xpath gets a worng value") xpath, s = tuple(entry) self.driver.find_element_by_xpath(xpath).click() sleep(s) @write_finish_info def clear_xpath(self, entry): """ 点击xpath的方法 传入必须为list,会检测list长度是否为2 """ if not isinstance(entry, list) and len(entry) != 2: raise ValueError("click_xpath gets a worng value") xpath, s = tuple(entry) self.driver.find_element_by_xpath(xpath).clear() sleep(s) @write_finish_info def refresh(self, s): """ 在等待s秒后,refresh """ sleep(s) self.driver.refresh() @write_finish_info def drag_and_drop(self, entry): if not isinstance(entry, list) and len(entry) != 4: raise ValueError("drag_and_drop gets a wrong value") action = ActionChains(self.driver) source_xpath, target_xpath, s = tuple(entry) source = self.driver.find_element_by_xpath(source_xpath) target = self.driver.find_element_by_xpath(target_xpath) move_mouse_to_element(self.driver, target) action.drag_and_drop(source, target).perform() sleep(s) @write_finish_info def drag_and_drop1(self, entry): if not isinstance(entry, list) and len(entry) != 3: raise ValueError("drag_and_drop gets a wrong value") action = ActionChains(self.driver) source_xpath, target_xpath, s = tuple(entry) source = self.driver.find_element_by_xpath(source_xpath) target = self.driver.find_element_by_xpath(target_xpath) move_mouse_to_element1(self.driver, target) action.drag_and_drop(source, target).perform() sleep(s)
----------------------------------------------------------------------------------------------
from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver import ActionChains from selenium.common.exceptions import UnexpectedAlertPresentException from selenium.webdriver.common.action_chains import ActionChains from Login import * import time driver = webdriver.Chrome(executable_path="/Users/jerry/PycharmProjects/untitled/venv/Goole/chromedriver") auto = AutoTest(driver) while True: step = 0 login(auto, step)
有啥疑问欢迎提出,共同进步
by-咯咯