【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  阅读(251)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 模様 (TV size ver.) Ivy to Fraudulent Game
  3. 3 河口恭吾
  4. 4 愛してる 高鈴
  5. 5 一生所爱 卢冠廷,莫文蔚
  6. 6 世间美好与你环环相扣 柏松
  7. 7 理想三旬 陈鸿宇
  8. 8 不浪漫罪名 王杰
  9. 9 樱花树下 张敬轩
  10. 10 因为你在 达闻西乐队,福禄寿FloruitShow
  11. 11 悬溺 葛东琪
樱花树下 - 张敬轩
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 林若宁

作曲 : 伍卓贤

树荫有一只蝉 跌落你身边

惊慌到失足向前

然后扑入我一双肩

令你腼腆一脸 像樱花万千

怀念美好高中两年

期望你的青春不变

去到今天

还记得樱花正开

还未懂跟你示爱

初春来时彼此约定过 继续期待

人置身这大时代

投入几番竞技赛

曾分开曾相爱

等待花蕊又跌下来

才洞悉这是恋爱

未有过的爱情 但有种温馨

未有过的爱情 但有种温馨

归家那单车小径

沿路细听你的歌声

没法再三倾听 你的感动昵称

维系错的一番友情

无奈已经不可纠正

太过坚贞

还记得樱花正开

还未懂跟你示爱

初春来时彼此闭着眼 渴望未来

人置身这大时代

投入几番竞技赛

曾分开曾相爱

等待跟你未爱的爱

你说悲不悲哀

秒速之间变改 小小世界

眷恋也许走不过 拆卸的街

少女亦随年渐长 走得多么快

如有天樱花再开

如有天樱花再开

期望可跟你示爱

当天园林 今天已换上满地青苔

如有天置地门外

乘电车跨过大海

匆匆跟你相望一眼 没理睬

明日花 昨日已开