Преглед на файлове

EVAL in Code

pull/164/head
naibo преди 1 година
родител
ревизия
593d01ed9e
променени са 7 файла, в които са добавени 40 реда и са изтрити 27 реда
  1. +1
    -0
      .temp_to_pub/EasySpider_windows_x64/execution_instances/0.json
  2. +1
    -0
      .temp_to_pub/EasySpider_windows_x64/execution_instances/1.json
  3. +1
    -0
      .temp_to_pub/EasySpider_windows_x64/execution_instances/2.json
  4. +1
    -0
      .temp_to_pub/EasySpider_windows_x64/tasks/209.json
  5. +1
    -1
      ExecuteStage/.vscode/launch.json
  6. +25
    -25
      ExecuteStage/easyspider_executestage.py
  7. +10
    -1
      ExecuteStage/utils.py

+ 1
- 0
.temp_to_pub/EasySpider_windows_x64/execution_instances/0.json Целия файл

@ -0,0 +1 @@
{"id":0,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"8/14/2023, 5:40:55 PM","update_time":"8/14/2023, 5:40:55 PM","version":"0.5.0","saveThreshold":10,"cloudflare":0,"environment":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[{"id":0,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":1,"name":"参数1_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"数码"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"5","code":"self.a = 1\nself.b = 2","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":3,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"paras":[{"nodeType":1,"contentType":0,"relative":false,"name":"参数1_链接文本","desc":"","extractType":0,"relativeXPath":"/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[EVAL[\"self.a + self.b\"]]","allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[2]","//a[contains(., '数码')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a"],"exampleValues":[{"num":0,"value":"数码"}],"unique_index":"603bndbum96llaop8rs","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}}]}

+ 1
- 0
.temp_to_pub/EasySpider_windows_x64/execution_instances/1.json Целия файл

@ -0,0 +1 @@
{"id":1,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"8/14/2023, 5:40:55 PM","update_time":"8/14/2023, 5:46:44 PM","version":"0.5.0","saveThreshold":10,"cloudflare":0,"environment":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[{"id":0,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":1,"name":"参数1_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"数码"},{"id":2,"name":"自定义操作2","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,4,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"5","code":"self.a = 1\nself.b = 2","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":4,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"paras":[{"nodeType":1,"contentType":0,"relative":false,"name":"参数1_链接文本","desc":"","extractType":0,"relativeXPath":"/html/body/div[5]/div[Field[\"自定义操作2\"]]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[EVAL[\"self.a + self.b\"]]","allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[2]","//a[contains(., '数码')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a"],"exampleValues":[{"num":0,"value":"数码"}],"unique_index":"603bndbum96llaop8rs","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}},{"id":3,"index":4,"parentId":0,"type":0,"option":5,"title":"自定义操作2","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"6","code":"self.a","waitTime":0,"recordASField":0,"paraType":"text"}}]}

+ 1
- 0
.temp_to_pub/EasySpider_windows_x64/execution_instances/2.json Целия файл

@ -0,0 +1 @@
{"id":2,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"8/14/2023, 5:40:55 PM","update_time":"8/14/2023, 5:49:34 PM","version":"0.5.0","saveThreshold":10,"cloudflare":0,"environment":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[{"id":0,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":1,"name":"参数1_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"数码"},{"id":2,"name":"自定义操作2","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,4,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"5","code":"self.a = 1\nself.b = 2","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":4,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"paras":[{"nodeType":1,"contentType":0,"relative":false,"name":"参数1_链接文本","desc":"","extractType":0,"relativeXPath":"/html/body/div[5]/div[Field[\"自定义操作2\"]]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[EVAL(\"self.a + self.b\")]","allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[2]","//a[contains(., '数码')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a"],"exampleValues":[{"num":0,"value":"数码"}],"unique_index":"603bndbum96llaop8rs","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}},{"id":3,"index":4,"parentId":0,"type":0,"option":5,"title":"自定义操作2","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"6","code":"self.a","waitTime":0,"recordASField":0,"paraType":"text"}}]}

+ 1
- 0
.temp_to_pub/EasySpider_windows_x64/tasks/209.json Целия файл

@ -0,0 +1 @@
{"id":209,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"8/14/2023, 5:40:55 PM","update_time":"8/14/2023, 5:49:34 PM","version":"0.5.0","saveThreshold":10,"cloudflare":0,"environment":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[{"id":0,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":1,"name":"参数1_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"数码"},{"id":2,"name":"自定义操作2","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,4,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"5","code":"self.a = 1\nself.b = 2","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":4,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"paras":[{"nodeType":1,"contentType":0,"relative":false,"name":"参数1_链接文本","desc":"","extractType":0,"relativeXPath":"/html/body/div[5]/div[Field[\"自定义操作2\"]]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[EVAL(\"self.a + self.b\")]","allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/a[2]","//a[contains(., '数码')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a"],"exampleValues":[{"num":0,"value":"数码"}],"unique_index":"603bndbum96llaop8rs","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}},{"id":3,"index":4,"parentId":0,"type":0,"option":5,"title":"自定义操作2","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"codeMode":"6","code":"self.a","waitTime":0,"recordASField":0,"paraType":"text"}}]}

+ 1
- 1
ExecuteStage/.vscode/launch.json Целия файл

@ -12,7 +12,7 @@
"justMyCode": false,
// "args": ["--id", "[7]", "--read_type", "remote", "--headless", "0"]
// "args": ["--id", "[9]", "--read_type", "remote", "--headless", "0", "--saved_file_name", "YOUTUBE"]
"args": ["--id", "[17]", "--headless", "0", "--user_data", "0", "--keyboard", "0"]
"args": ["--id", "[2]", "--headless", "0", "--user_data", "0", "--keyboard", "0"]
}
]
}

+ 25
- 25
ExecuteStage/easyspider_executestage.py Целия файл

@ -502,7 +502,7 @@ class BrowserThread(Thread):
max_wait_time = 999999
# self.print_and_log(codeMode, code)
# 将value中的Field[""]替换为outputParameters中的键值
code = replace_field_values(code, self.outputParameters)
code = replace_field_values(code, self.outputParameters, self)
if iframe and self.browser.iframe_env == False:
# 获取所有的 iframe
self.browser.switch_to.default_content()
@ -595,7 +595,7 @@ class BrowserThread(Thread):
if codeMode == 2: # 使用循环的情况下,传入的clickPath就是实际的xpath
try:
loopPath = replace_field_values(
loopPath, self.outputParameters)
loopPath, self.outputParameters, self)
elements = self.browser.find_elements(
By.XPATH, loopPath, iframe=paras["iframe"])
element = elements[index]
@ -639,7 +639,7 @@ class BrowserThread(Thread):
optionValue = loopValue
optionMode = 1
try:
xpath = replace_field_values(para["xpath"], self.outputParameters)
xpath = replace_field_values(para["xpath"], self.outputParameters, self)
dropdown = Select(self.browser.find_element(
By.XPATH, xpath, iframe=para["iframe"]))
try:
@ -669,8 +669,8 @@ class BrowserThread(Thread):
def moveToElement(self, para, loopElement=None, loopPath="", index=0):
time.sleep(0.1) # 移动之前等待0.1秒
loopPath = replace_field_values(loopPath, self.outputParameters)
xpath = replace_field_values(para["xpath"], self.outputParameters)
loopPath = replace_field_values(loopPath, self.outputParameters, self)
xpath = replace_field_values(para["xpath"], self.outputParameters, self)
if para["useLoop"]: # 使用循环的情况下,传入的clickPath就是实际的xpath
if xpath == "":
path = loopPath
@ -683,7 +683,7 @@ class BrowserThread(Thread):
else:
index = 0
path = xpath # 不然使用元素定义的xpath
path = replace_field_values(path, self.outputParameters)
path = replace_field_values(path, self.outputParameters, self)
try:
elements = self.browser.find_elements(
By.XPATH, path, iframe=para["iframe"])
@ -709,7 +709,7 @@ class BrowserThread(Thread):
try:
if node["parameters"]["waitElement"] != "":
waitElement = replace_field_values(
node["parameters"]["waitElement"], self.outputParameters)
node["parameters"]["waitElement"], self.outputParameters, self)
waitElementTime = float(node["parameters"]["waitElementTime"])
waitElementIframeIndex = node["parameters"]["waitElementIframeIndex"]
self.print_and_log("等待元素出现:", waitElement)
@ -798,7 +798,7 @@ class BrowserThread(Thread):
bodyText = self.browser.find_element(
By.CSS_SELECTOR, "body", iframe=cnode["parameters"]["iframe"]).text
value = replace_field_values(
cnode["parameters"]["value"], self.outputParameters)
cnode["parameters"]["value"], self.outputParameters, self)
if bodyText.find(value) >= 0:
executeBranchId = i
break
@ -807,7 +807,7 @@ class BrowserThread(Thread):
elif tType == 2: # 当前页面包含元素
try:
xpath = replace_field_values(
cnode["parameters"]["value"], self.outputParameters)
cnode["parameters"]["value"], self.outputParameters, self)
if self.browser.find_element(By.XPATH, xpath, iframe=cnode["parameters"]["iframe"]):
executeBranchId = i
break
@ -816,7 +816,7 @@ class BrowserThread(Thread):
elif tType == 3: # 当前循环元素包括文本
try:
value = replace_field_values(
cnode["parameters"]["value"], self.outputParameters)
cnode["parameters"]["value"], self.outputParameters, self)
if loopElement.text.find(value) >= 0:
executeBranchId = i
break
@ -825,7 +825,7 @@ class BrowserThread(Thread):
elif tType == 4: # 当前循环元素包括元素
try:
xpath = replace_field_values(
cnode["parameters"]["value"][1:], self.outputParameters)
cnode["parameters"]["value"][1:], self.outputParameters, self)
if loopElement.find_element(By.XPATH, xpath):
executeBranchId = i
break
@ -904,7 +904,7 @@ class BrowserThread(Thread):
"Page changed detected, continue loop.")
bodyText = newBodyText
xpath = replace_field_values(
node["parameters"]["xpath"], self.outputParameters)
node["parameters"]["xpath"], self.outputParameters, self)
# self.recordLog("循环元素|Loop element:", xpath)
element = self.browser.find_element(
By.XPATH, xpath, iframe=node["parameters"]["iframe"])
@ -954,7 +954,7 @@ class BrowserThread(Thread):
elif int(node["parameters"]["loopType"]) == 1: # 不固定元素列表
try:
xpath = replace_field_values(
node["parameters"]["xpath"], self.outputParameters)
node["parameters"]["xpath"], self.outputParameters, self)
elements = self.browser.find_elements(By.XPATH,
xpath, iframe=node["parameters"]["iframe"])
# self.recordLog("循环元素|Loop element:", xpath)
@ -1022,7 +1022,7 @@ class BrowserThread(Thread):
# 千万不要忘了分割!!
for path in node["parameters"]["pathList"].split("\n"):
try:
path = replace_field_values(path, self.outputParameters)
path = replace_field_values(path, self.outputParameters, self)
element = self.browser.find_element(
By.XPATH, path, iframe=node["parameters"]["iframe"])
# self.recordLog("循环元素|Loop element:", path)
@ -1084,9 +1084,9 @@ class BrowserThread(Thread):
textList = node["parameters"]["textList"].split("\n")
if len(textList) == 1: # 如果固定文本列表只有一行,现在就可以替换变量
textList = replace_field_values(
node["parameters"]["textList"], self.outputParameters).split("\n")
node["parameters"]["textList"], self.outputParameters, self).split("\n")
for text in textList:
text = replace_field_values(text, self.outputParameters)
text = replace_field_values(text, self.outputParameters, self)
# self.recordLog("当前循环文本|Current loop text:", text)
for i in node["sequence"]: # 挨个执行操作
self.executeNode(i, text, "", 0)
@ -1108,13 +1108,13 @@ class BrowserThread(Thread):
filter(isnotnull, node["parameters"]["textList"].split("\n"))) # 去空行
if len(urlList) == 1: # 如果固定网址列表只有一行,现在就可以替换变量
urlList = replace_field_values(
node["parameters"]["textList"], self.outputParameters).split("\n")
node["parameters"]["textList"], self.outputParameters, self).split("\n")
# urlList = []
# for url in tempList:
# if url != "":
# urlList.append(url)
for url in urlList:
url = replace_field_values(url, self.outputParameters)
url = replace_field_values(url, self.outputParameters, self)
# self.recordLog("当前循环网址|Current loop url:", url)
for i in node["sequence"]:
self.executeNode(i, url, "", 0)
@ -1179,7 +1179,7 @@ class BrowserThread(Thread):
else: # 在流程图其他位置设置了打开网页的操作,读取的应该是第一个网址,如打开网页后登录,再打开第二个网页
url = list(filter(isnotnull, para["links"].split("\n")))[0]
# 将value中的Field[""]替换为outputParameters中的键值
url = replace_field_values(url, self.outputParameters)
url = replace_field_values(url, self.outputParameters, self)
try:
maxWaitTime = int(para["maxWaitTime"])
except:
@ -1222,7 +1222,7 @@ class BrowserThread(Thread):
def inputInfo(self, para, loopValue):
time.sleep(0.1) # 输入之前等待0.1秒
try:
xpath = replace_field_values(para["xpath"], self.outputParameters)
xpath = replace_field_values(para["xpath"], self.outputParameters, self)
textbox = self.browser.find_element(
By.XPATH, xpath, iframe=para["iframe"])
# textbox.send_keys(Keys.CONTROL, 'a')
@ -1281,8 +1281,8 @@ class BrowserThread(Thread):
try:
# element = self.browser.find_element(
# By.XPATH, path, iframe=para["iframe"])
clickPath = replace_field_values(clickPath, self.outputParameters)
xpath = replace_field_values(para["xpath"], self.outputParameters)
clickPath = replace_field_values(clickPath, self.outputParameters, self)
xpath = replace_field_values(para["xpath"], self.outputParameters, self)
if para["useLoop"]: # 使用循环的情况下,传入的clickPath就是实际的xpath
if xpath == "":
path = clickPath
@ -1548,7 +1548,7 @@ class BrowserThread(Thread):
# 提取数据事件
def getData(self, para, loopElement, isInLoop=True, parentPath="", index=0):
parentPath = replace_field_values(parentPath, self.outputParameters)
parentPath = replace_field_values(parentPath, self.outputParameters, self)
if para["clear"] == 1:
self.clearOutputParameters()
try:
@ -1574,7 +1574,7 @@ class BrowserThread(Thread):
if p["optimizable"]:
try:
relativeXPath = replace_field_values(
p["relativeXPath"], self.outputParameters)
p["relativeXPath"], self.outputParameters, self)
# 只有当前环境不变变化才可以快速提取数据
if self.browser.iframe_env != p["iframe"]:
p["optimizable"] = False
@ -1653,7 +1653,7 @@ class BrowserThread(Thread):
if not p["optimizable"]:
content = ""
relativeXPath = replace_field_values(
p["relativeXPath"], self.outputParameters)
p["relativeXPath"], self.outputParameters, self)
if not (p["contentType"] == 5 or p["contentType"] == 6): # 如果不是页面标题或URL,去找元素
try:
# relativeXPath = relativeXPath.lower()

+ 10
- 1
ExecuteStage/utils.py Целия файл

@ -177,11 +177,20 @@ def write_to_csv(file_name, data, record):
f.close()
def replace_field_values(orginal_text, outputParameters):
def eval_repl(matchobj):
print(matchobj.group(1))
return str(eval(matchobj.group(1), globals(), locals()))
def replace_field_values(orginal_text, outputParameters, browser=None):
pattern = r'Field\["([^"]+)"\]'
try:
replaced_text = re.sub(
pattern, lambda match: outputParameters.get(match.group(1), ''), orginal_text)
if replaced_text.find("EVAL") != -1: # 如果返回值中包含EVAL
replaced_text = replaced_text.replace("self.", "browser.")
replaced_text = re.sub(r'EVAL\("(.*?)"\)', lambda match: str(eval(match.group(1))), replaced_text)
except:
replaced_text = orginal_text
return replaced_text

Зареждане…
Отказ
Запис