【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 定位下拉选择框元素

selenium Xpath应用疑难一:contains的用法

selenium~进阶操作定位一组元素、定位多层框架/窗口、下拉框处理、提示框处理、上传文件操作

菡哥125Python中pyautogui库的最全使用方法

泡沫小哥哥Selenium中错误:selenium.common.exceptions.ElementClickInterceptedException: Message: element click inte

守护@往昔13 - selenium 常见操作,js操作-将元素滚动到页面可见区域

 

posted @ 2022-04-11 16:23  Owen_ET  阅读(231)  评论(0编辑  收藏  举报