基于selenium的web自动化学习之路总结(三)–Python+元素定位

  • Post author:
  • Post category:python


导语

本次通过执行业务在管理后台新建商品,来记录一些编写脚本时遇到的难点和问题,具体业务步骤为:登录管理后台–>商品管理–>添加新商品–>编辑商品的一些信息–>提交。

一、frame切换

图1 商品名称

直到打开添加新商品的页面,都可以采用常用的元素定位方式,开始编辑商品信息,查看商品名称(图1),看起来是熟悉的配方,用name来定位,然而,执行程序后,发现并没有如预期那样输入商品名称,那问题出在哪里呢?

图2 商品名称相关HTML

随后采用了xpath等方式来定位,程序执行后,依旧并没有将商品名称填入输入框,copy的xpath路径为:/html/body/div[2]/div[2]/dl/form/dd[1]/ul/li[1]/input

分析HTML,发现这个网页存在嵌套关系,这样就需要切换到目标frame,才能定位到“商品名称”,代码如下:

# 切换到子页面中
chromedriver.switch_to.frame("mainFrame")
chromedriver.find_element_by_name("name").send_keys("iphone 10")

二、ActionChains

图3 商品分类

图4 ActionChains

每一级的商品分类采用id定位即可,但是最后要选中末级分类,需要双击此分类,这就涉及到高级元素操作。ActionChains中封装了所有可以对页面元素进行的高级操作(图4),这里使用双击操作,代码如下:

# 双击末级分类名即可选择分类
ActionChains(chromedriver).double_click(chromedriver.find_element_by_id("7")).perform()

Action是动作行为的意思,Chains是链表的意思,chromedriver代表了当前浏览器,合起来就是把当前浏览器转换成一个可以执行各种操作的行为链。

三、css_selector 用法

图5 点击选择图片

1、css_selector 用法三

通过分析“点击选择图片”对应的HTML(图5),发现没有id、name等标签,而copy xpath、css_selector也均是动态的,因此无法定位:

xpath –> //*[@id=”rt_rt_1g971rjvv1donc7qdag1d6uej8″]/label

css_selector –> #rt_rt_1g971rjvv1donc7qdag1d6uej8 > label

观察HTML(图5),这个label的父级是一个div,也是用的动态id,继续往上查看,再上一个父级div有一个id=”filePicker”,而我们的目标label是祖先元素下唯一的,这样我们可以使用css_selector的第3种用法,代码如下:

chromedriver.find_element_by_css_selector("#filePicker label").click()

2、css_selector 用法总结

copy的方法:右键-检查元素,选择copy–>copy selector。

手写方法:

(1)标签名可以直接在css_selector中使用,加上[]即可。例如chromedriver.find_element_by_css_selector(“[value=’2′]”).click()

(2)在属性class前面加.   例如:chromedriver.find_element_by_css_selector(“.shopCar_btn_03.fl”).click()

(3)在属性id前加#    例如:chromedriver.find_element_by_css_selector(“#username”).click()

3.1 空格表示祖先元素和子孙元素的关系,例如:chromedriver.find_element_by_css_selector(“#filePicker label”).click()

3.2 大于号>表示父子关系,例如:chromedriver.find_element_by_css_selector(“#filePicker>label”).click()

四、选择图片

图6 打开系统弹窗

根据上述css_selector的定位方式,确实可以定位到“点击选择图片”这个按钮,打开了系统的选择文件的弹窗(图6),这个实际上无法去定位选择文件,那我们只能再换一个思路。

图7 点击选择图片原HTML

再仔细来分析这个按钮的HTML(图7),label往上有个并列的input,删除input中的class(图8)。

图8 删除class后的点击选择图片

从图8中可以看出,在前端点击的“点击选择图片”按钮,并不是真正负责上传文件的控件,真正负责上传文件的控件是<input type=”file”……>,所以我们直接对这个控件进行定位,并sendkeys发送图片的路径即可,代码如下:

chromedriver.find_element_by_name("file").send_keys("C:\\test\\test.jpeg")

五、总结

本次说明了元素定位时切换frame、ActionChains的使用情况,并总结了css_selector的用法,尝试去分析如何去处理选择图片的问题。

成长之路,道阻且长,后续会继续总结自己平时遇到的一些问题,加油!



版权声明:本文为weixin_56385300原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。