影刀RPA 单选框与复选框的自动化操作

影刀RPA 单选框与复选框的自动化操作
影刀RPA 单选框与复选框的自动化操作作者林焱单选框和复选框是表单中的基础控件看着简单——不就是点一下嘛。但在自动化中这两个控件有不少坑点了但没勾上、重复点击反而取消了、选项文本相同值不同、批量勾选时效率低、状态判断不准导致重复操作。这篇文章把单选框和复选框的自动化操作方法讲全。一、单选框Radio1.1 基本操作单选框是一组互斥选项选了一个其他自动取消。# 方法一直接点击目标选项click_element(//input[typeradio and valueoption1])# 方法二点击选项的label更可靠click_element(//label[contains(text(), 选项A)])# 方法三点击选项的容器divclick_element(//div[classradio-option and contains(text(), 选项A)])1.2 选择指定选项defselect_radio(group_name,target_value):选择指定单选框# 通过name属性定位一组单选框radiosget_element_list(f//input[typeradio and name{group_name}])forradioinradios:valueradio.get_attribute(value)ifvaluetarget_value:radio.click()returnTrueprint(f未找到值为{target_value}的单选框)returnFalse# 使用select_radio(gender,male)1.3 按文本选择defselect_radio_by_text(container_selector,target_text):按选项文本选择单选框# 获取所有选项optionsget_element_list(f{container_selector}.radio-option)foroptioninoptions:textoption.text.strip()iftexttarget_text:option.click()returnTrue# 模糊匹配foroptioninoptions:iftarget_textinoption.text:option.click()returnTruereturnFalse# 使用select_radio_by_text(.gender-group,男)1.4 获取当前选中项defget_selected_radio(group_name):获取当前选中的单选框radiosget_element_list(f//input[typeradio and name{group_name}])forradioinradios:ifradio.get_attribute(checked):returnradio.get_attribute(value)returnNone# 没有选中任何选项1.5 检查是否已选中再点击defsafe_select_radio(radio_selector,target_value):安全选择先检查是否已选中radioget_element(radio_selector)ifradio.get_attribute(checked):print(已经选中了不需要重复点击)returnTrueradio.click()# 验证是否选中成功time.sleep(0.3)ifradio.get_attribute(checked):returnTrueelse:print(点击后仍未选中)returnFalse坑重复点击取消选择有些自定义单选框点击已选中的选项会取消选择。所以一定要先检查状态。坑点击了input但没触发有些网站的事件绑在label上直接点input不生效。优先点击label。二、复选框Checkbox2.1 勾选单个复选框defcheck_checkbox(checkbox_selector):勾选复选框如果未勾选checkboxget_element(checkbox_selector)# 检查当前状态is_checkedcheckbox.get_attribute(checked)ifis_checked:returnTrue# 已经勾选# 未勾选点击勾选checkbox.click()time.sleep(0.2)# 验证ifcheckbox.get_attribute(checked):returnTruereturnFalse2.2 取消勾选defuncheck_checkbox(checkbox_selector):取消勾选如果已勾选checkboxget_element(checkbox_selector)ifnotcheckbox.get_attribute(checked):returnTrue# 本来就没勾选checkbox.click()time.sleep(0.2)ifnotcheckbox.get_attribute(checked):returnTruereturnFalse2.3 设置复选框状态defset_checkbox(checkbox_selector,should_check):设置复选框到指定状态checkboxget_element(checkbox_selector)is_checkedcheckbox.get_attribute(checked)ifshould_checkandnotis_checked:checkbox.click()elifnotshould_checkandis_checked:checkbox.click()# 如果状态已经正确不做任何操作坑直接点击不看状态# 错误不管当前状态直接点checkbox.click()# 如果已经勾选了这就取消了# 正确先检查状态ifnotis_checked:checkbox.click()2.4 批量勾选defcheck_multiple(checkbox_selector,target_values):批量勾选多个复选框checkboxesget_element_list(checkbox_selector)forcheckboxincheckboxes:valuecheckbox.get_attribute(value)is_checkedcheckbox.get_attribute(checked)ifvalueintarget_values:# 需要勾选ifnotis_checked:checkbox.click()else:# 不需要勾选ifis_checked:checkbox.click()# 取消勾选# 使用check_multiple(//input[typecheckbox and namehobbies],[reading,music,sports])2.5 全选/取消全选defselect_all(checkbox_selector):全选checkboxesget_element_list(checkbox_selector)forcheckboxincheckboxes:ifnotcheckbox.get_attribute(checked):checkbox.click()time.sleep(0.1)defdeselect_all(checkbox_selector):取消全选checkboxesget_element_list(checkbox_selector)forcheckboxincheckboxes:ifcheckbox.get_attribute(checked):checkbox.click()time.sleep(0.1)坑全选按钮本身也是复选框表格表头的全选复选框也在你的元素列表里遍历时把它也点了。需要排除# 排除表头的全选按钮checkboxesget_element_list(//input[typecheckbox and not(contains(class, select-all))])2.6 获取所有已选中的值defget_checked_values(checkbox_selector):获取所有已勾选复选框的值checkboxesget_element_list(checkbox_selector)checked_values[]forcheckboxincheckboxes:ifcheckbox.get_attribute(checked):valuecheckbox.get_attribute(value)checked_values.append(value)returnchecked_values三、自定义单选/复选框3.1 用div模拟的单选/复选框现代网站常用divCSS模拟单选/复选框外观好看但DOM结构不同!-- 自定义复选框 --divclasscustom-checkboxdata-valueoption1spanclasscheckbox-icon/spanspanclasscheckbox-label选项A/span/div处理方法# 不能用input的checked属性判断状态# 要看容器的class或aria-checked属性defcheck_custom_checkbox(label_text):操作自定义复选框# 找到选项容器containerget_element(f//div[classcustom-checkbox and contains(., {label_text})])# 检查状态通常通过class判断class_attrcontainer.get_attribute(class)is_checkedcheckedinclass_attrifnotis_checked:container.click()time.sleep(0.2)# 验证class_attrcontainer.get_attribute(class)ifcheckedinclass_attr:returnTrueelse:returnTrue# 已经勾选returnFalse3.2 判断自定义控件的状态不同网站的状态标识不同# 方式一class包含checked/selectedis_checkedcheckedinelement.get_attribute(class)# 方式二aria-checked属性is_checkedelement.get_attribute(aria-checked)true# 方式三data-checked属性is_checkedelement.get_attribute(data-checked)true# 方式四子元素的存在is_checkedelement.find_element_by_css_selector(.check-mark)isnotNone坑状态判断方式不通用每个网站的自定义控件状态标识不同。需要先F12检查目标网站的控件结构确定状态判断方式。四、从Excel读取选择项4.1 根据Excel数据选择importpandasaspd# 读取配置configpd.read_excel(D:\\form_config.xlsx).iloc[0].to_dict()# 性别单选select_radio_by_text(.gender-group,config[性别])# 爱好多选hobbiesstr(config[爱好]).split(、)# 阅读、音乐、运动 → [阅读, 音乐, 运动]forhobbyinhobbies:check_custom_checkbox(hobby)# 同意条款复选框check_checkbox(#agree-terms)4.2 批量表单填写deffill_form(form_data):根据数据填写表单# 单选框ifgenderinform_data:select_radio_by_text(.gender-group,form_data[gender])# 复选框ifhobbiesinform_data:forhobbyinform_data[hobbies]:check_custom_checkbox(hobby)# 全选/取消ifform_data.get(select_all_categories):select_all(.category-checkbox)# 验证所有选择是否正确verify_form(form_data)五、实战场景5.1 注册表单填写# 1. 选择性别单选select_radio_by_text(.gender-section,男)# 2. 选择用户类型单选select_radio_by_text(.user-type-section,企业用户)# 3. 勾选服务条款复选框check_checkbox(#agree-service)# 4. 勾选订阅复选框check_checkbox(#subscribe-email)# 5. 不勾选营销推送uncheck_checkbox(#marketing-push)# 6. 提交click_element(#submit-btn)5.2 批量设置权限# 从Excel读取权限配置permissionspd.read_excel(D:\\permissions.xlsx)for_,rowinpermissions.iterrows():userrow[用户]modulesstr(row[模块权限]).split(,)# 1. 选择用户单选select_radio_by_text(.user-list,user)# 2. 取消所有模块勾选deselect_all(.module-checkbox)# 3. 勾选指定模块formoduleinmodules:check_custom_checkbox(module.strip())# 4. 保存click_element(#save-permissions)wait_for_element(.save-success)print(f已设置{user}的权限{modules})5.3 表格中的复选框# 表格每行有一个复选框勾选满足条件的行rowsget_element_list(//tr[classdata-row])forrowinrows:# 获取行的数据statusrow.find_element_by_css_selector(.status).text amountfloat(row.find_element_by_css_selector(.amount).text.replace(¥,))# 勾选金额大于1000且状态为待处理的行ifstatus待处理andamount1000:checkboxrow.find_element_by_css_selector(input[typecheckbox])ifnotcheckbox.get_attribute(checked):checkbox.click()六、避坑清单坑1checked属性返回None而不是False# 未勾选时get_attribute(checked)返回None不是falseifcheckbox.get_attribute(checked):# None → Falseprint(已勾选)# 这个判断是正确的None被当作False坑2元素在label后面inputtypecheckboxidagreestyledisplay:nonelabelforagree同意条款/labelinput是隐藏的点击不到。点击labelclick_element(//label[foragree])坑3点击区域太小自定义复选框的可点击区域可能很小。点击整个选项容器而不是checkbox图标# 不推荐只点击checkbox图标click_element(.checkbox-icon)# 推荐点击整个选项行click_element(.checkbox-option)坑4勾选后页面刷新某些复选框勾选后会触发表单提交或页面刷新。勾选后等待页面刷新完成再继续操作。坑5复选框被禁用disabled属性的复选框不能操作。先检查是否禁用ifcheckbox.get_attribute(disabled):print(复选框被禁用无法操作)

最新新闻

日新闻

周新闻

月新闻