使用JS代码片段操作网页

更新时间:
复制为 MD 格式

概述

在开发自动化流程过程中,可能会遇到网页元素很复杂、需要使用JS脚本直接进行操作的情况。本文介绍如何执行JS代码片段。

示例

本文以日历中选择指定年月日为例。

image

说明

本例除了使用JS代码操作之外,自动化流程还可以使用动态捕捉控件并操作方式,也能达到所需效果。

编码开发模式

使用execute_js选中指定年月日。

from rpa.core import *
from rpa.utils import *
import rpa4 as rpa # 使用V4引擎

def start():
    # 在此处开始编写您的应用
    # 设置指定日期
    date = '2022-9-22'
    # js脚本
    js_code = """
    function data(params){
    var years = params.split('-')[0];
    var month = params.split('-')[1];
    var day = params.split('-')[2];
    
    var date_doc = document.getElementsByClassName('cosc-card-content-border cosc-card-shadow cosc-card-light-bg-border')[0];
    setTimeout(function(){
       console.log('开始选年份');
        var year = date_doc.getElementsByClassName('cos-cascader')[0].getElementsByTagName('div')[0].getElementsByTagName('span')[0].innerText.split('年')[0];
        if(year != years){
			
			date_doc.getElementsByClassName('cos-cascader')[0].getElementsByTagName('i')[0].click();
            setTimeout(function() {
				years_list=date_doc.getElementsByClassName('cos-cascader')[0].getElementsByClassName('cos-cascader-options')[0].getElementsByClassName('cos-cascader-option-text');
				for(var i = 0;i < years_list.length;i++){
					year = years_list[i].innerText.split('年')[0];
					if(year == years){
						years_list[i].click();
						console.log('年份已选');
						
					}
				}
			}, 1000);
            
            
        }
		setTimeout(function() {
		    console.log('开始选月份');
	        month_part = date_doc.getElementsByClassName('header-block-2_38JLk cu-ml-sm-lg')[0].getElementsByClassName('cos-cascader-entry')[0].getElementsByTagName('span')[0].innerText.split('月')[0];
	        if(month_part != month){
				date_doc.getElementsByClassName('header-block-2_38JLk cu-ml-sm-lg')[0].getElementsByClassName('cos-cascader-entry')[0].getElementsByTagName('i')[0].click();
				setTimeout(function() {
					month_list = date_doc.getElementsByClassName('header-block-2_38JLk cu-ml-sm-lg')[0].getElementsByClassName('cos-popover cos-cascader-panel')[0].getElementsByClassName('cos-cascader-options')[0].getElementsByClassName('cos-cascader-option-text');
					for(var i = 0;i < month_list.length;i++){
						month_part = month_list[i].innerText.split('月')[0];
						if(month_part == month){
							month_list[i].click();
							console.log('月份已选');
						}
					}
				}, 500);
	            
	        }
		}, 2000);
		
		setTimeout(function() {
		    console.log('开始选日期');
	        var lists = document.getElementsByClassName('_page-list_shkz3_132 page-list_6fhk3')[0].getElementsByClassName('_light_1so0w_1')[0].getElementsByClassName('content_1Jdsr')[0].getElementsByClassName('cos-row')[0].getElementsByClassName('cos-col');
	        for(var i = 0;i < lists.length;i++){
	            class_name = lists[i].className;
				var reg = RegExp('opacity')
				if(reg.test(class_name) != true){
					date = lists[i].getElementsByClassName('number_7sHfk')[0].innerText;
					if(date == day){
						lists[i].getElementsByClassName('number_7sHfk')[0].click();
						console.log('日期已选');
					}
					
					
			}
	            
	               
	        }
		}, 3000);
		
    },1000)

    return('日期操作完成')
};
// 调用js函数
result = data('%s');
return result;
                """%date
    
    page = rpa.app.chrome.create('https://www.baidu.com/s?wd=%E6%97%A5%E5%8E%86')
    sleep(3)
    # 通过execute_js组件执行js脚本
    result = page.execute_js(js_code)
    print(result)

可视化开发模式

使用执行JS选中指定的年月日

  • 可视化工程如下

    image

  • 执行JS组件中,执行的代码如下

    function data(params){
        var years = params.split('-')[0];
        var month = params.split('-')[1];
        var day = params.split('-')[2];
        
        var date_doc = document.getElementsByClassName('cosc-card-content-border cosc-card-shadow cosc-card-light-bg-border')[0];
        setTimeout(function(){
           console.log('开始选年份');
            var year = date_doc.getElementsByClassName('cos-cascader')[0].getElementsByTagName('div')[0].getElementsByTagName('span')[0].innerText.split('年')[0];
            if(year != years){
    			
    			date_doc.getElementsByClassName('cos-cascader')[0].getElementsByTagName('i')[0].click();
                setTimeout(function() {
    				years_list=date_doc.getElementsByClassName('cos-cascader')[0].getElementsByClassName('cos-cascader-options')[0].getElementsByClassName('cos-cascader-option-text');
    				for(var i = 0;i < years_list.length;i++){
    					year = years_list[i].innerText.split('年')[0];
    					if(year == years){
    						years_list[i].click();
    						console.log('年份已选');
    						
    					}
    				}
    			}, 1000);
                
                
            }
    		setTimeout(function() {
    		    console.log('开始选月份');
    	        month_part = date_doc.getElementsByClassName('header-block-2_38JLk cu-ml-sm-lg')[0].getElementsByClassName('cos-cascader-entry')[0].getElementsByTagName('span')[0].innerText.split('月')[0];
    	        if(month_part != month){
    				date_doc.getElementsByClassName('header-block-2_38JLk cu-ml-sm-lg')[0].getElementsByClassName('cos-cascader-entry')[0].getElementsByTagName('i')[0].click();
    				setTimeout(function() {
    					month_list = date_doc.getElementsByClassName('header-block-2_38JLk cu-ml-sm-lg')[0].getElementsByClassName('cos-popover cos-cascader-panel')[0].getElementsByClassName('cos-cascader-options')[0].getElementsByClassName('cos-cascader-option-text');
    					for(var i = 0;i < month_list.length;i++){
    						month_part = month_list[i].innerText.split('月')[0];
    						if(month_part == month){
    							month_list[i].click();
    							console.log('月份已选');
    						}
    					}
    				}, 500);
    	            
    	        }
    		}, 2000);
    		
    		setTimeout(function() {
    		    console.log('开始选日期');
    	        var lists = document.getElementsByClassName('_page-list_shkz3_132 page-list_6fhk3')[0].getElementsByClassName('_light_1so0w_1')[0].getElementsByClassName('content_1Jdsr')[0].getElementsByClassName('cos-row')[0].getElementsByClassName('cos-col');
    	        for(var i = 0;i < lists.length;i++){
    	            class_name = lists[i].className;
    				var reg = RegExp('opacity')
    				if(reg.test(class_name) != true){
    					date = lists[i].getElementsByClassName('number_7sHfk')[0].innerText;
    					if(date == day){
    						lists[i].getElementsByClassName('number_7sHfk')[0].click();
    						console.log('日期已选');
    					}
    					
    					
    			}
    	            
    	               
    	        }
    		}, 3000);
    		
        },1000)
    
        return('日期操作完成')
    };
    result = data("''' + date_time + '''");
    return result;