selenium接管方式

1、指定启动参数打开浏览器

# 指定chrome 远程调试接口与用户目录
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"

2selenium接管

self.options = webdriver.ChromeOptions()
self.options.add_experimental_option("debuggerAddress", "127.0.1:9222")
self.chromeDriver = webdriver.Chrome(driverPath, options=self.options)

chrome远程调试原理分析(CDP协议)

参考链接

https://chromedevtools.github.io/devtools-protocol/

https://chromedevtools.github.io/devtools-protocol/

https://ceshiren.com/t/topic/3567

https://www.daimajiaoliu.com/daima/4eee866b8900402

协议

webdriver协议

使用 DevTools 作为协议客户端

开发者工具前端可以附加到远程运行的 Chrome 实例进行调试。要使此方案正常运行,您应该使用 remote-debugging-port 命令行开关启动您的主机Chrome 实例

chrome.exe --remote-debugging-port=9222

然后,您可以使用不同的用户配置文件启动一个单独的客户端Chrome 实例:

chrome.exe --user-data-dir=<某个目录>

现在,您可以从客户端导航到给定端口并附加到任何发现的选项卡以进行调试:http://localhost:9222

监听协议

这对于理解 DevTools 前端如何使用协议特别方便。您可以在发生时查看所有请求/响应和方法。

协议监视器的屏幕截图

单击 DevTools 右上角的齿轮图标以打开设置面板。选择设置左侧的实验。打开“Protocol Monitor”,然后关闭并重新打开 DevTools。现在单击 ⋮ 菜单图标,选择更多工具,然后选择协议监视器

您还可以使用协议监视器(版本 92.0.4497.0+)发出您自己的命令。如果该命令不需要任何参数,请在“协议监视器”面板底部的提示中键入该命令,然后按 Enter,例如, Page.captureScreenshot。如果命令需要参数,请将它们作为 JSON 提供,例如 {"command":"Page.captureScreenshot","parameters":{"format": "jpeg"}}.

http获取启动信息

GET /json/version

Browser version metadata

{
    "Browser": "Chrome/72.0.3601.0",
    "Protocol-Version": "1.3",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3601.0 Safari/537.36",
    "V8-Version": "7.2.233",
    "WebKit-Version": "537.36 (@cfede9db1d154de0468cb0538479f34c0755a0f4)",
    "webSocketDebuggerUrl": "ws://localhost:9222/devtools/browser/b0b8a4fb-bb17-4359-9533-a8d9f3908bd8"
}

GET /json or /json/list

A list of all available websocket targets.

[ {
  "description": "",
  "devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:9222/devtools/page/DAB7FB6187B554E10B0BD18821265734",
  "id": "DAB7FB6187B554E10B0BD18821265734",
  "title": "Yahoo",
  "type": "page",
  "url": "https://www.yahoo.com/",
  "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/DAB7FB6187B554E10B0BD18821265734"
} ]

GET /json/protocol/

The current devtools protocol, as JSON:

{
  "domains": [
      {
          "domain": "Accessibility",
          "experimental": true,
          "dependencies": [
              "DOM"
          ],
          "types": [
              {
                  "id": "AXValueType",
                  "description": "Enum of possible property types.",
                  "type": "string",
                  "enum": [
                      "boolean",
                      "tristate",
// ...

GET /json/new?{url}

Opens a new tab. Responds with the websocket target data for the new tab.

GET /json/activate/{targetId}

Brings a page into the foreground (activate a tab).

For valid targets, the response is 200: "Target activated". If the target is invalid, the response is 404: "No such target id: {targetId}"

GET /json/close/{targetId}

Closes the target page identified by targetId.

For valid targets, the response is 200: "Target is closing". If the target is invalid, the response is 404: "No such target id: {targetId}"

WebSocket /devtools/page/{targetId}

The WebSocket endpoint for the protocol.

GET /devtools/inspector.html

A copy of the DevTools frontend that ship with Chrome.

远程调试步骤

1、设置远程调试端口

chrome.exe --remote-debugging-port=9222

2、http获取浏览信息

postman    http://localhost:9222/json/version
{
    "Browser": "Chrome/91.0.4472.124",
    "Protocol-Version": "1.3",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    "V8-Version": "9.1.269.36",
    "WebKit-Version": "537.36 (@7345a6d1bfcaff81162a957e9b7d52649fe2ac38)",
    "webSocketDebuggerUrl": "ws://localhost:9222/devtools/browser/325848c7-f588-4b2a-8d53-871d0c407498"
}

3、ws执行后续命令示例

# 获取sessionid

import websocket
import json
ws = websocket.create_connection("ws://localhost:9222/devtools/browser/325848c7-f588-4b2a-8d53-871d0c407498")
cmd = {"id": 100, "method": "Target.attachToTarget", "params": {"targetId":"C6D11457622705623B8F5381612D197D", "flatten":True}}
data = json.dumps(cmd, ensure_ascii=False)
ws.send(data)
while 1:
    result = ws.recv()
    print(result)

4、event示例

import websocket
import json
ws = websocket.create_connection("ws://localhost:9222/devtools/page/7064B86A54979CA238AABB1784858038")
cmd = {"id": 1, "method": "Page.enable", "params": {"windowId": 1, "bounds":{

}}}
data = json.dumps(cmd, ensure_ascii=False)
ws.send(data)
while 1:
    result = ws.recv()
    print(result)
E:\Desktop\RPAWork\CBSEditor\branches\develop_v3.0\RpaStudioPublish\public\python\python.exe E:/Desktop/RPAWork/CSEditorPython/trunk/compentsAdministration/2.py
{"id":1,"result":{}}
{"method":"Page.frameStartedLoading","params":{"frameId":"7064B86A54979CA238AABB1784858038"}}
{"method":"Page.frameDetached","params":{"frameId":"A099BBAD2608A370D9C76CA5479B5621","reason":"remove"}}
{"method":"Page.frameNavigated","params":{"frame":{"id":"7064B86A54979CA238AABB1784858038","loaderId":"95332EA5BBB3B9346ED939DB007F59D0","url":"https://fanyi.baidu.com/","urlFragment":"#en/zh/Types","domainAndRegistry":"baidu.com","securityOrigin":"https://fanyi.baidu.com","mimeType":"text/html","adFrameType":"none","secureContextType":"Secure","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":["SharedArrayBuffersTransferAllowed"]}}}
{"method":"Page.frameAttached","params":{"frameId":"CAC1E51A034347E0CD90FAC57B040682","parentFrameId":"7064B86A54979CA238AABB1784858038"}}
{"method":"Page.frameStartedLoading","params":{"frameId":"CAC1E51A034347E0CD90FAC57B040682"}}
{"method":"Page.frameNavigated","params":{"frame":{"id":"CAC1E51A034347E0CD90FAC57B040682","parentId":"7064B86A54979CA238AABB1784858038","loaderId":"62CC3D0059086BA4A88DB784C824BFD6","name":"doc-view-iframe","url":"about:blank","domainAndRegistry":"","securityOrigin":"://","mimeType":"text/html","adFrameType":"none","secureContextType":"Secure","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":["SharedArrayBuffersTransferAllowed"]}}}
{"method":"Page.frameStoppedLoading","params":{"frameId":"CAC1E51A034347E0CD90FAC57B040682"}}
{"method":"Page.domContentEventFired","params":{"timestamp":873617.921655}}
{"method":"Page.frameAttached","params":{"frameId":"E4F8EB74C7D088A7D98D9F2B6C02F25C","parentFrameId":"7064B86A54979CA238AABB1784858038","stack":{"callFrames":[{"functionName":"qL","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":89227},{"functionName":"cf","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":108246},{"functionName":"yk","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":108414},{"functionName":"ck","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":128015},{"functionName":"GZ.<computed>.<computed>","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":128242},{"functionName":"N5","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":138720},{"functionName":"y","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":39001},{"functionName":"","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":138980},{"functionName":"_iwWM","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":138987},{"functionName":"","scriptId":"280","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2008-s.js","lineNumber":0,"columnNumber":138992}]}}}
{"method":"Page.frameStartedLoading","params":{"frameId":"E4F8EB74C7D088A7D98D9F2B6C02F25C"}}
{"method":"Page.frameStoppedLoading","params":{"frameId":"E4F8EB74C7D088A7D98D9F2B6C02F25C"}}
{"method":"Page.frameDetached","params":{"frameId":"E4F8EB74C7D088A7D98D9F2B6C02F25C","reason":"remove"}}
{"method":"Page.frameAttached","params":{"frameId":"A85725E42A62F74C9D8873D8F81AD2BA","parentFrameId":"7064B86A54979CA238AABB1784858038","stack":{"callFrames":[{"functionName":"ix","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":62835},{"functionName":"aY","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":100587},{"functionName":"","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":101855},{"functionName":"xx.<computed>","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":109310},{"functionName":"v1","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":101811},{"functionName":"vW","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":102541},{"functionName":"p","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":144953},{"functionName":"Me.<computed>.<computed>","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":145288},{"functionName":"PN","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":147945},{"functionName":"D","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":41294},{"functionName":"","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":148232},{"functionName":"_3Ku4","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":148242},{"functionName":"","scriptId":"318","url":"https://dlswbr.baidu.com/heicha/mw/abclite-2060-s.js?v=0.14359652757150543","lineNumber":1,"columnNumber":148247}]}}}
{"method":"Page.frameStartedLoading","params":{"frameId":"A85725E42A62F74C9D8873D8F81AD2BA"}}
{"method":"Page.frameStoppedLoading","params":{"frameId":"A85725E42A62F74C9D8873D8F81AD2BA"}}
{"method":"Page.frameDetached","params":{"frameId":"A85725E42A62F74C9D8873D8F81AD2BA","reason":"remove"}}
{"method":"Page.loadEventFired","params":{"timestamp":873623.526458}}
{"method":"Page.frameStoppedLoading","params":{"frameId":"7064B86A54979CA238AABB1784858038"}}

在日常的SAP开发和应用中,经常需要通过查询SAP数据表来处理日常业务,比如:数据对账、报表SQL测试、SAP查询功能开发等。通过开发SAP查询分析器,SAP实施和开发人员,可以在较短的时间内查询到需要的数据以及关联的数据;也可以通过该功能,生成程序源代码,减少数据查询和报表开发的工作量,提高工作效率:具体功能如下:

1、日常数据查询、关联查询、数据对账;

2、报表及其它SAP功能开发的SQL语句测试;

3、查询报表源代码生成;

        4、查询格式保存与重复利用。

1、功能设计:

1) 类似于微软和ORACLE的数据库查询分析器,在SQL编辑器中输入SQL语句、可以是一条,也可以是多条。通过执行功能,则显示查询的数据清单;

2)将设计好的查询语句,保存到数据库中,便于重复使用,提高查询设计的效率;

3)将输入的SQL语句,通过格式化功能,让SQL语句便于阅读和修改;

4)将SAP透明表加入查询分析器中,通过选择相应的字段,动态生成SQL语句。减少SQL语句的编辑工作;

5)输入SQL,运行生成查询清单。将查询重新组织,生成ABAP源代码,通过粘贴复制功能,快速在SAP中生成用户需要的查询报表。

2、应用前景:

    通过SAP查询分析器的应用,SAP实施和开发人员可以快速的查询到需要的数据,业务查询报表也可以快速的生成。过去需要查询关联的数据时,需要通过在SAP中编写程序、开发实现,报表开发完成后,需要反复的测试和调整,往往需要几天的时间来完成一个查询功能的开发。SAP查询分析器可以对SQL语句进行测试、报表源代码自动生成、日常数据查询、数据对账、指标查询等,不仅数据准确,而且只要业务逻辑清楚,几分钟就可以完成数据的查询和报表生成。大大提高的工作效率,也减少了系统维护成本,在信息化建设中应用广泛。

3、开发思路

   (1)、使用类CL_GUI_TEXTEDIT,实现SQL编辑窗口;

   (2)、使用类CL_GUI_ALV_GRID,显示查询清单;

   (3)、使用类CL_GUI_ALV_TREE,显示与设置透明表查询字段;

   (4)、使用类CL_GUI_EASY_SPLITTER_CONTAINER,设置布局;

   (5)、使用ABAP动态编辑技术,实现动态清单显示;

4、效果

SAP <wbr>查询分析器,查询报表自动生成,SQL查询测试


5、源代码整理中......

原文地址:http://blog.sina.com.cn/s/blog_ad5dbd0201010qt8.html

作者已经放弃更新了,源代码我也没有,特此说明!

原文地址:http://blog.sina.com.cn/s/blog_ad5dbd0201010qtt.html

公司间需要买卖操作,由于发货和收货都是同一批人在操作,为了减少业务人员的工作量,提高工作效率,特实现以上功能

  1、增强实现:增强点为交货单过账成功时触发,在提交前触发,如果遇到不可预知问题,可能造成数据不一致,所以在过账成功后触发,效果更好。

  2、BADI增强:DELIVERY_PUBLISH:数据库更新期间交货数据的公告,采用方法:PUBLISH_AFTER_SAVE

  3、功能实现:由于该增强没有参数,所以问题的关键是业务数据的获取,采用以下方法获取,其他功能就大家自己具体去实现了,这里只是把关键的地方粘贴出来:

  FIELD-SYMBOLS : <V_VBELN> TYPE LIKP-VBELN.
  FIELD-SYMBOLS : <V_LFART> TYPE LIKP-LFART.
  FIELD-SYMBOLS : <V_LFDAT> TYPE LIKP-LFDAT.
  FIELD-SYMBOLS : <V_VKBUR> TYPE LIKP-VKBUR.
  FIELD-SYMBOLS : <V_MBLNR> TYPE EMKPF-MBLNR.
  DATA : V_VAL TYPE STRING VALUE '(SAPMV50A)LIKP-VBELN'.
  DATA : V_VAL1 TYPE STRING VALUE '(SAPMV50A)LIKP-LFART'.

  DATA : V_VAL2 TYPE STRING VALUE '(SAPMV50A)LIKP-WADAT_IST'.
  DATA : V_VAL3 TYPE STRING VALUE '(SAPMV50A)emkpf-MBLNR'.
  DATA : V_VAL4 TYPE STRING VALUE '(SAPMV50A)LIKP-VKBUR'.
  CLEAR:C_VBELN,C_LFART,C_BUDAT,C_MBLNR,C_YEAR,C_JZRQ,
        C_CPZH,C_WERKS,C_LGORT.
  DATA:I_LOG TYPE TABLE OF ZMDLOG,
       W_LOG TYPE ZMDLOG.
*********获取交货类型
  ASSIGN (V_VAL1) TO <V_LFART>.
  MOVE <V_LFART> TO C_LFART.
*********获取物料凭证
  ASSIGN (V_VAL3) TO <V_MBLNR>.
  MOVE <V_MBLNR> TO C_MBLNR.
*********获取交货单号
  ASSIGN (V_VAL) TO <V_VBELN>.
  MOVE <V_VBELN> TO C_VBELN.
*********销售办公室
  ASSIGN (V_VAL4) TO <V_VKBUR>.
  MOVE <V_VKBUR> TO C_VKBUR.

  4、采购订单自动生产使用BAPI:BAPI_PO_CREATE1

  5、采购收货使用BAPI:BAPI_GOODSMVT_CREATE

  6、当需要交货单冲销时,增强点为交货过账冲销前,要先保证采购收货冲销成功并删除采购订单,才能执行过账冲销,这样才能保证数据的连续性,采购入库冲销的BAPI:BAPI_GOODSMVT_CANCEL

  注意:当交货过账成功,采购订单没有生产时,我们要扑捉异常,同时冲销交货单这样才能保证数据的一致性。

1、include

databegin of gth_qamr.
        include structure qamr.
data: kurztext like qamv-kurztext,
      ztext like qamv-kurztext,
      verwmerkm like qamv-verwmerkm,
      steuerkz  like qamv-steuerkz.
dataend of gth_qamr.
data: gtd_qamr like table of gth_qamr.

 

2、append

 

结构复用:引用自江正军老师-博客园 博客链接:www.cnblogs.com/jiangzhengjun


TYPES BEGIN OF struc_type
   TYPES comp ..
   TYPES comp TYPE struc_type BOXED"参照另一结构类型
   INCLUDE { {TYPE struc_type} | {STRUCTURE struc} } "将另一结构包括进来
        [AS name [RENAMING WITH SUFFIX suffix]]
TYPES END OF struc_type.