【Python自动化】之特殊的自动化定位操作
今天有时间了,想好好的把之前遇到过的自动化问题总结一下,以后有新的总结再更新
目录:
一、上传文件(4.11)
二、下拉框选择(4.11)
三、下拉框隐藏元素定位(6.20)
一、上传文件
利用鼠标pymouse、键盘pykeyboard操作
import pyperclip from pykeyboard import PyKeyboard from pymouse import PyMouse def upload_file(self, fileName): """PyUserInput方法:上传文件""" # 创建鼠标对象 k = PyKeyboard() # 创建键盘对象 m = PyMouse() # 模拟快捷键Command+Shift+G k.press_keys(["Command", "Shift", "G"]) # 输入文件路径 x_dim, y_dim = m.screen_size() # //点击屏幕中间,除法取整数 m.click(x_dim // 2, y_dim // 2, 1) # 点击,想x,y坐标,button:-1表示左键,-2表示右键,n:默认1次,2双击 # 复制文件文件全路径 pyperclip.copy(fileName) # 粘贴路径,模拟快捷键Command+V k.press_keys(["Command", "V"]) k.tap_key("Shift") # 加上这个之后才能点击回车(未知情况) for i in range(2): k.press_key("return") time.sleep(2) # 调用上传文件方法 def uploadImg(self, imgLoc, imgName): """上传图片文件""" self.el_click(imgLoc) Fun().upload_file(loc.filePathData + imgName) sleep(2)
二、下拉框选择 返回目录
1、Select下拉框
# ①在basePage定义Select下拉选择方法 def webDriverWait(self, loc): """显式等待,查找单元素""" WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc)) return self.find_element(loc) def el_select(self, loc, text): """下拉框选择元素""" Select(self.webDriverWait(loc)).select_by_visible_text(text) # ②定位Select元素 province_loc = (By.CSS_SELECTOR, "form>div:nth-child(4)>div>div>label:nth-child(1)>select") # ③调用Select方法 self.el_select(loc.province_loc, loc.province)
2、非Select下拉框
1)方法一:
优:定位元素写法简洁,定位速度较快
缺:不利于维护,定位不明确
def els_click_index(self, loc, index): """点击多元素事件:坐标""" self.webDriverWaits(loc)[index-1].click() # 定位多元素 regionName1_loc = (By.CSS_SELECTOR, "ul>li>span") # 定位多元素,并根据元素的坐标位置,进行选择 self.els_click_index(loc.regionName1_loc, 2) # 坐标点:选择第二个下拉框,运行22s283ms
2)方法二:
优:定位元素写法简洁,定位元素明确利于维护
缺:定位速度最慢
def els_click(self, loc, name): """点击多元素事件:元素""" list = self.webDriverWaits(loc) for i in list: if name == i.text: i.click() time.sleep(2) # 定位元素 regionName2 = "新建区域2" regionName2_loc = (By.XPATH, "//ul/li/span") # 定位多元素,并且调用方法点击指定名元素 self.els_click(loc.regionName2_loc, loc.regionName2) # 多元素方法:选择第二个下拉框,运行25s624ms
3)方法三:(推荐)
优:定位元素明确利于维护,定位速度最快
缺:定位元素写法较长
def el_click(self, loc): """点击单元素事件""" self.webDriverWait(loc).click() # 定位多元素,并模糊查找元素 regionName2 = "新建区域2" regionName3_loc = (By.XPATH, f"//ul/li/span[contains(text(),'{regionName2}')]") # 定位多元素,并且点击指定名元素 self.el_click(loc.regionName3_loc) # 多元素简写:选择第二个下拉框,运行20s246ms
综合以上三种方法,方法三效果更好,选择元素目的明确,代码运行时间更少,代码更简洁。
3、下拉框隐藏元素定位
1)方法一:
location_once_scrolled_into_view,滚动到网页上的特定元素
def el_clickBoxView(self, loc): """点击下拉框隐藏的元素""" self.webDriverWait(loc).location_once_scrolled_into_view self.el_click(loc) # 元素定位 regionName3_loc = (By.XPATH, f"//ul/li/span[contains(text(),'{regionName2}')]") # 进行定位 self.el_clickBoxView(loc.regionName3_loc)
2)方法二:
def executeScript(self, js, loc): """执行JS元素""" if loc == None: return self.driver.execute_script(js) else: return self.driver.execute_script(js, self.webDriverWait(loc)) regionName2 = contractorData['regionName'] regionName3_loc = (By.XPATH, f"//ul/li/span[contains(text(),'{regionName2}')]") regionName_js = "arguments[0].scrollIntoView(false);" regionName_click_js = "arguments[0].click();" # 下拉框到不可见的元素:JS方法 self.executeScript(loc.regionName_js, loc.regionName3_loc) self.executeScript("arguments[0].click();", loc.regionName3_loc)
附录: 返回目录
参考文章
②泠月飞花《selenium Xpath应用疑难一:contains的用法》
③Listen-Y《selenium~进阶操作定位一组元素、定位多层框架/窗口、下拉框处理、提示框处理、上传文件操作》
④菡哥125《Python中pyautogui库的最全使用方法》
⑤泡沫小哥哥《Selenium中错误:selenium.common.exceptions.ElementClickInterceptedException: Message: element click inte》
⑥守护@往昔《13 - selenium 常见操作,js操作-将元素滚动到页面可见区域》
不积跬步,无以致千里;不集小流,无以成江海。
如转载本文,请还多关注一下我的博客:https://www.cnblogs.com/Owen-ET/;
我的Github地址:https://github.com/Owen-ET————————————
无善无恶心之体, 有善有恶意之动, 知善知恶是良知, 为善去恶是格物。