07 第七章 中级:下拉框、上传文件、下载文件、日历修改



以上:网页元素的基础操作,已经介绍完毕。(配置文件:定位信息与代码逻辑是分开的)

接下来,介绍下常见但是有点难度的页面元素的操作。

一、下拉框:select标签对象

1.1 页面及html代码

本质:都是select标签对象:

职位选择的下拉框:

地区(省市区)的下拉框:

1.2 代码实践:两种方式

1.

浏览器中用控制台来进行选项的选择:

类名满足moco-form-control(整个form表单)的有以下20个对象(有的是input标签,有的是select选择器):我们要找的是职位job这个选择器对象:

拿到职位job这个选择器对象,可以看到它有很多的可能的option选项:

将其value赋值为“25”这个学生选项:

2.

方式一:

driver.find_elements(By.CLASS_NAME,"moco-form-control")[11].find_elements(By.TAG_NAME,"option")[2].click()

3.方式二:

用selenium自己封装好的方法Select:

from selenium.webdriver.support.select import Select

select_element = driver.find_elements(By.CLASS_NAME,"moco-form-control")[11]        # 先拿到所有的option列表
Select(select_element).select_by_index(2)                            # 方法1
# Select(select_element).select_by_value("1")                        # 方法2
# Select(select_element).select_by_visible_text("页面重构设计")        # 方法3

4.结果

两种大的方式,均能成功的实施下拉框的职位选择:

查看源码---> 猜测用法

1.3 实际项目,封装

我觉得没有必要封装,直接使用Selenium提供的api不好吗:

二、上传文件

2.1 两种类型

页面:

标签是input类型:

谷歌浏览器的导入书签,选择文件按钮,标签是个button

2.2 情况一:标签是input类型:

直接send_key方法,跟上文件路径,搞定。

2.3 情况二:标签不是input类型:通过第三方PyUserInput包,模拟键盘操作

通过模拟键盘指令。

1.

先安装PyWinHook包。(不是PyHook,因为它没有Python10的对应包)

  • 可以通过下述的安装包,用cmd命令行安装。链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/

  • 也可以通过在PyCharm这个编辑器中,直接搜索上述的pyWinHook插件,安装即可

然后,安装PyUserInput包

2.

发送一个路径,键盘enter一下:

from selenium import webdriver
import time
from pykeyboard import PyKeyboard

driver = webdriver.Chrome()
pykey = PyKeyboard()                              # 实例化一个键盘对象
driver.get("chrome://settings/importData")

time.sleep(15)
pykey.type_string(r"D:\Documents\Desktop\20210406005025.jpg")
time.sleep(5)
pykey.tap_key(pykey.enter_key)              
time.sleep(3)

driver.close()

结果:

确实路径加进去了,但是中文输入法的原因导致出错:

3.

改正:

再在前面,加个转换输入法的键盘指令:

from selenium import webdriver
import time
from pykeyboard import PyKeyboard

driver = webdriver.Chrome()
pykey = PyKeyboard()                              # 实例化一个键盘对象
driver.get("chrome://settings/importData")

time.sleep(15)
pykey.press_keys([pykey.control_key, pykey.space_key])           # 模拟同时按下Ctrl和Space键,转换输入法
pykey.type_string(r"D:\Documents\Desktop\20210406005025.jpg")
time.sleep(5)
pykey.tap_key(pykey.enter_key)              
time.sleep(3)

driver.close()

结果:

成功的输入了正确路径,已成功上传:

其实:再跑自动化的时候,将中文输入法全部干掉,只有英文输入法,上述问题就不存在了。

更多参看:https://github.com/SavinaRoja/PyUserInput

2.4 封装方法

针对非input类型的上传:

两种类型,都封装到一个方法中:(我觉得有点多余。。。只保留上面那个就可以了)

封装嘛,就是锻炼Python函数的设计和调用的技术了

2.5 小结

上述的方式的共性:都需要有一个文件路径(即上传的对象),作为参数。

三、下载文件

3.1 原理

指定默认的下载路径+键盘enter确认

发送键盘事件:

  • 使用selenium的方法
  • 或者第三方包的PyKeyboard方法

3.2 selenium

页面:

3.3 代码实践

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.select import Select
from selenium.webdriver.support import expected_conditions as EC
from pykeyboard import PyKeyboard

options = webdriver.ChromeOptions()
prefs = {'download.default_directory':os.getcwd(),'profile.default_content_settings.popups':0}          # 优先设置:指定下载目录、不用系统弹窗(直接确认)。
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=options)  # 实例化一个谷歌浏览器对象
# driver = webdriver.Chrome(options=options)


driver.get("https://www.imooc.com/mobile/app")
time.sleep(3)
driver.find_elements(By.CLASS_NAME, "btn-download")[1].click()

time.sleep(10)
driver.close()

结果:

能够成功的,不用弹窗的下载。

3.4 封装方法

    def download_file(self,info):
        '''
        下载文件
        '''
        self.click_element(info)
    

然后,初识化浏览器时,就指定浏览器的相关参数。

四、日历修改

4.1 页面:两种情况

功能测试:只需要点击,选择年月日即可。

自动化测试:

1.情况一:可以直接输入的日历

2.情况二:只能够读的日历

4.2 原理剖析

情况一:因为是input标签,所以直接输入即可

情况二:因为input标签还存在只读属性,所以不能直接进行修改。

  • 怎么办?先移除这个属性,变为情况一。

4.3 代码实践

先写一段JavaScript代码,然后让浏览器对象执行一下这串js代码。

然后,就是跟情况一一致的部分:找到元素、直接输入。

4.4 封装方法

其实是一个条件判断,但是下面也可以写成try except

上述侧重于api的运用、思维习惯。

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 07 第七章 中级:下拉框、上传文件、下载文件、日历修改


Follow excellence, and success will chase you.