|
@@ -10,93 +10,92 @@ export default defineContentScript({
|
|
|
window.onload = () => {
|
|
|
chrome.runtime.sendMessage(getPageInfo())
|
|
|
console.log(document.title)
|
|
|
-
|
|
|
}
|
|
|
let form = null
|
|
|
let formChildren = []
|
|
|
let excelDataA = {}
|
|
|
- chrome.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
|
|
|
- if (message.type === 'GET_PAGE_INFO') {
|
|
|
- sendResponse({
|
|
|
- data: getPageInfo()
|
|
|
- })
|
|
|
- }
|
|
|
- let dom = null
|
|
|
- if (message.type === 'GET_TAG_ACTION') {
|
|
|
- const data = message.data
|
|
|
- if (0) {
|
|
|
- dom = document.getElementById(data.id)
|
|
|
- } else {
|
|
|
- dom = [...document.getElementsByTagName(data.tag.toLowerCase())]
|
|
|
- // .filter(_ => _.className.includes(data.class))
|
|
|
- .filter(_ => _.innerText.includes(data.text))[0]
|
|
|
+ chrome.runtime.onMessage.addListener(
|
|
|
+ async (message, sender, sendResponse) => {
|
|
|
+ if (message.type === 'GET_PAGE_INFO') {
|
|
|
+ sendResponse({
|
|
|
+ data: getPageInfo()
|
|
|
+ })
|
|
|
}
|
|
|
- console.log(dom)
|
|
|
- if (!dom) {
|
|
|
- sendResponse({ data: '未找到元素,请重试', statue: 'error' })
|
|
|
- return
|
|
|
+ let dom = null
|
|
|
+ if (message.type === 'GET_TAG_ACTION') {
|
|
|
+ const data = message.data
|
|
|
+ if (0) {
|
|
|
+ dom = document.getElementById(data.id)
|
|
|
+ } else {
|
|
|
+ dom = [...document.getElementsByTagName(data.tag.toLowerCase())]
|
|
|
+ // .filter(_ => _.className.includes(data.class))
|
|
|
+ .filter((_) => _.innerText.includes(data.text))[0]
|
|
|
+ }
|
|
|
+ console.log(dom)
|
|
|
+ if (!dom) {
|
|
|
+ sendResponse({ data: '未找到元素,请重试', statue: 'error' })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 添加红色边框,500ms后移除边框,然后点击
|
|
|
+ const originalBorder = dom.style.border
|
|
|
+ dom.style.border = '2px solid red'
|
|
|
+ setTimeout(() => {
|
|
|
+ dom.style.border = originalBorder
|
|
|
+ dom.click()
|
|
|
+ }, 1000)
|
|
|
+ sendResponse({ data: '完成' })
|
|
|
+ return true
|
|
|
}
|
|
|
- // 添加红色边框,500ms后移除边框,然后点击
|
|
|
- const originalBorder = dom.style.border
|
|
|
- dom.style.border = '2px solid red'
|
|
|
- setTimeout(() => {
|
|
|
- dom.style.border = originalBorder
|
|
|
- dom.click()
|
|
|
- }, 1000)
|
|
|
- sendResponse({ data: '完成' })
|
|
|
- return true
|
|
|
- }
|
|
|
|
|
|
- if (message.type === 'GET_PAGE_FORM') {
|
|
|
+ if (message.type === 'GET_PAGE_FORM') {
|
|
|
+ const len = document.querySelectorAll('form').length
|
|
|
+ if (document.title === '智能招采' && len === 1) {
|
|
|
+ sendResponse({
|
|
|
+ status: 'error',
|
|
|
+ message: '没有找到表单'
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- const len = document.querySelectorAll('form').length
|
|
|
- if (document.title === '智能招采' && len === 1) {
|
|
|
+ if (len) {
|
|
|
+ const forms = document.querySelectorAll('form')
|
|
|
+ if (len > 1) {
|
|
|
+ form = forms[len - 1]
|
|
|
+ } else form = forms[0]
|
|
|
+ form.querySelectorAll('svg').forEach((el) => el.remove())
|
|
|
+ formChildren = [...form.elements]
|
|
|
+ }
|
|
|
+ // if (!form && document.querySelector("input")) {
|
|
|
+ // const arr = []
|
|
|
+ // const inputs = document.querySelectorAll("input")
|
|
|
+ // formChildren = [...inputs]
|
|
|
+
|
|
|
+ // for (const element of inputs) {
|
|
|
+ // arr.push(element.outerHTML)
|
|
|
+ // }
|
|
|
+ // form = { outerHTML: JSON.stringify(arr) }
|
|
|
+ // }
|
|
|
+ if (!form) {
|
|
|
+ sendResponse({
|
|
|
+ status: 'error',
|
|
|
+ message: '没有找到表单'
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
sendResponse({
|
|
|
- status: 'error',
|
|
|
- message: '没有找到表单'
|
|
|
+ status: 'ok',
|
|
|
+ data: form.outerHTML
|
|
|
})
|
|
|
- return
|
|
|
}
|
|
|
-
|
|
|
- if (len) {
|
|
|
- const forms = document.querySelectorAll('form')
|
|
|
- if (len > 1) {
|
|
|
- form = forms[len - 1]
|
|
|
- } else form = forms[0]
|
|
|
- form.querySelectorAll('svg')
|
|
|
- .forEach((el) => el.remove())
|
|
|
- formChildren = [...form.elements]
|
|
|
- }
|
|
|
- // if (!form && document.querySelector("input")) {
|
|
|
- // const arr = []
|
|
|
- // const inputs = document.querySelectorAll("input")
|
|
|
- // formChildren = [...inputs]
|
|
|
-
|
|
|
- // for (const element of inputs) {
|
|
|
- // arr.push(element.outerHTML)
|
|
|
- // }
|
|
|
- // form = { outerHTML: JSON.stringify(arr) }
|
|
|
- // }
|
|
|
- if (!form) {
|
|
|
- sendResponse({
|
|
|
- status: 'error',
|
|
|
- message: '没有找到表单'
|
|
|
- })
|
|
|
- return
|
|
|
+ if (message.type === 'INPUT_FORM') {
|
|
|
+ const { formData, excelData } = message.data
|
|
|
+ excelDataA = excelData
|
|
|
+ console.log(formData, excelDataA)
|
|
|
+ await handleFillInput(formData, 0)
|
|
|
}
|
|
|
- sendResponse({
|
|
|
- status: 'ok',
|
|
|
- data: form.outerHTML
|
|
|
- })
|
|
|
- }
|
|
|
- if (message.type === 'INPUT_FORM') {
|
|
|
- const { formData, excelData } = message.data
|
|
|
- excelDataA = excelData
|
|
|
- console.log(formData, excelDataA)
|
|
|
- await handleFillInput(formData, 0)
|
|
|
+ return true
|
|
|
}
|
|
|
- return true
|
|
|
- })
|
|
|
+ )
|
|
|
|
|
|
function getPageInfo() {
|
|
|
const favIconUrl = getFavicon()
|
|
@@ -139,11 +138,19 @@ export default defineContentScript({
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
const item = data[i]
|
|
|
if (item.findBy === 'id') {
|
|
|
- const input = formChildren.find(child => child.id === item.findByValue)
|
|
|
- if (item.type === 'text' || item.type === 'textarea' || item.type === 'number') {
|
|
|
+ const input = formChildren.find(
|
|
|
+ (child) => child.id === item.findByValue
|
|
|
+ )
|
|
|
+ if (
|
|
|
+ item.type === 'text' ||
|
|
|
+ item.type === 'textarea' ||
|
|
|
+ item.type === 'number'
|
|
|
+ ) {
|
|
|
if (!input) {
|
|
|
if (item.label) {
|
|
|
- const label = [...form.getElementsByTagName('label')].find(label => label.innerText.includes(item.label))
|
|
|
+ const label = [...form.getElementsByTagName('label')].find(
|
|
|
+ (label) => label.innerText.includes(item.label)
|
|
|
+ )
|
|
|
if (label) {
|
|
|
const input = findLabelForInput(label)
|
|
|
if (input) {
|
|
@@ -158,35 +165,48 @@ export default defineContentScript({
|
|
|
}
|
|
|
if (item.type === 'radio' || item.type === 'checkbox') {
|
|
|
if (item.label) {
|
|
|
-
|
|
|
- const label = [...form.getElementsByTagName('label')].find(label => label.innerText.includes(item.label))
|
|
|
+ const label = [...form.getElementsByTagName('label')].find(
|
|
|
+ (label) => label.innerText.includes(item.label)
|
|
|
+ )
|
|
|
if (label) {
|
|
|
const span = findLabelForSpan(label)
|
|
|
- span.forEach(span => {
|
|
|
- span.innerText === excelDataA[item.excelColumn] && span.click()
|
|
|
+ span.forEach((span) => {
|
|
|
+ span.innerText === excelDataA[item.excelColumn] &&
|
|
|
+ span.click()
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (item.type === 'date') {
|
|
|
-
|
|
|
- const input = formChildren.find(child => child.id === item.findByValue)
|
|
|
+ const input = formChildren.find(
|
|
|
+ (child) => child.id === item.findByValue
|
|
|
+ )
|
|
|
if (excelDataA[item.excelColumn]) {
|
|
|
-
|
|
|
- await simulateCompleteUserAction(input, input, formatDate(excelDataA[item.excelColumn]), formatDate(excelDataA[item.excelColumn]))
|
|
|
+ await simulateCompleteUserAction(
|
|
|
+ input,
|
|
|
+ input,
|
|
|
+ formatDate(excelDataA[item.excelColumn]),
|
|
|
+ formatDate(excelDataA[item.excelColumn])
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (item.findBy === 'placeholder') {
|
|
|
- const input = formChildren.find(child => child.placeholder === item.findByValue)
|
|
|
+ const input = formChildren.find(
|
|
|
+ (child) => child.placeholder === item.findByValue
|
|
|
+ )
|
|
|
if (input) {
|
|
|
simulateUserInput(input, excelDataA[item.excelColumn])
|
|
|
}
|
|
|
}
|
|
|
if (item.findBy === 'label') {
|
|
|
if (!excelDataA[item.excelColumn]) continue
|
|
|
- const label = [...form.getElementsByTagName('label')].find(label => label.innerText.includes(item.findByValue) || item.findByValue.includes(label.innerText))
|
|
|
+ const label = [...form.getElementsByTagName('label')].find(
|
|
|
+ (label) =>
|
|
|
+ label.innerText.includes(item.findByValue) ||
|
|
|
+ item.findByValue.includes(label.innerText)
|
|
|
+ )
|
|
|
console.log(label)
|
|
|
if (!label) continue
|
|
|
if (item.type === 'radio' || item.type === 'checkbox') {
|
|
@@ -194,10 +214,13 @@ export default defineContentScript({
|
|
|
|
|
|
if (label) {
|
|
|
const span = findLabelForSpan(label)
|
|
|
- span.forEach(span => {
|
|
|
+ span.forEach((span) => {
|
|
|
console.log(span.innerText)
|
|
|
if (span.innerText) {
|
|
|
- if (span.innerText.includes(excelDataA[item.excelColumn]) || excelDataA[item.excelColumn].includes(span.innerText)) {
|
|
|
+ if (
|
|
|
+ span.innerText.includes(excelDataA[item.excelColumn]) ||
|
|
|
+ excelDataA[item.excelColumn].includes(span.innerText)
|
|
|
+ ) {
|
|
|
console.log(span)
|
|
|
span.click()
|
|
|
}
|
|
@@ -211,11 +234,23 @@ export default defineContentScript({
|
|
|
console.log(input, excelDataA[item.excelColumn])
|
|
|
|
|
|
if (input) {
|
|
|
- await simulateCompleteUserAction(input, input, formatDate(excelDataA[item.excelColumn]), formatDate(excelDataA[item.excelColumn]))
|
|
|
+ await simulateCompleteUserAction(
|
|
|
+ input,
|
|
|
+ input,
|
|
|
+ formatDate(excelDataA[item.excelColumn]),
|
|
|
+ formatDate(excelDataA[item.excelColumn])
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (item.type === 'input' || item.type === 'text' || item.type === 'number' || item.type === 'tel' || item.type === 'email' || item.type === 'textarea') {
|
|
|
+ if (
|
|
|
+ item.type === 'input' ||
|
|
|
+ item.type === 'text' ||
|
|
|
+ item.type === 'number' ||
|
|
|
+ item.type === 'tel' ||
|
|
|
+ item.type === 'email' ||
|
|
|
+ item.type === 'textarea'
|
|
|
+ ) {
|
|
|
let input
|
|
|
if (item.type === 'textarea') {
|
|
|
input = findLabelForTextarea(label)
|
|
@@ -302,7 +337,12 @@ export default defineContentScript({
|
|
|
}
|
|
|
return null
|
|
|
}
|
|
|
- const simulateCompleteUserAction = async (clickElement, inputElement, inputText, tdTitle) => {
|
|
|
+ const simulateCompleteUserAction = async (
|
|
|
+ clickElement,
|
|
|
+ inputElement,
|
|
|
+ inputText,
|
|
|
+ tdTitle
|
|
|
+ ) => {
|
|
|
// 1. 模拟鼠标弹起事件
|
|
|
const simulateMouseUp = (element) => {
|
|
|
const mouseUpEvent = new MouseEvent('mouseup', {
|
|
@@ -322,7 +362,7 @@ export default defineContentScript({
|
|
|
const simulateTyping = async (element, text, delay = 50) => {
|
|
|
element.focus()
|
|
|
for (let char of text) {
|
|
|
- await new Promise(resolve => setTimeout(resolve, delay))
|
|
|
+ await new Promise((resolve) => setTimeout(resolve, delay))
|
|
|
|
|
|
// 按键按下
|
|
|
const keydownEvent = new KeyboardEvent('keydown', {
|
|
@@ -399,27 +439,27 @@ export default defineContentScript({
|
|
|
|
|
|
// 1. 触发鼠标弹起
|
|
|
simulateMouseUp(clickElement)
|
|
|
- await new Promise(resolve => setTimeout(resolve, 100))
|
|
|
+ await new Promise((resolve) => setTimeout(resolve, 100))
|
|
|
|
|
|
// 2. 模拟键盘输入
|
|
|
await simulateTyping(inputElement, inputText)
|
|
|
- await new Promise(resolve => setTimeout(resolve, 200))
|
|
|
+ await new Promise((resolve) => setTimeout(resolve, 200))
|
|
|
|
|
|
// 3. 查找并点击td元素
|
|
|
// const tdElement = await findTdByTitle(tdTitle);
|
|
|
|
|
|
const enterKeyEvent = new KeyboardEvent('keydown', {
|
|
|
- key: 'Enter', // 事件键名
|
|
|
- code: 'Enter', // 物理按键编码
|
|
|
- keyCode: 13, // 传统键码(Enter键为13)
|
|
|
- which: 13, // 同keyCode
|
|
|
- bubbles: true, // 允许事件冒泡
|
|
|
- cancelable: true // 允许事件被取消
|
|
|
+ key: 'Enter', // 事件键名
|
|
|
+ code: 'Enter', // 物理按键编码
|
|
|
+ keyCode: 13, // 传统键码(Enter键为13)
|
|
|
+ which: 13, // 同keyCode
|
|
|
+ bubbles: true, // 允许事件冒泡
|
|
|
+ cancelable: true // 允许事件被取消
|
|
|
})
|
|
|
setTimeout(() => {
|
|
|
inputElement.dispatchEvent(enterKeyEvent)
|
|
|
}, 0)
|
|
|
- await new Promise(resolve => setTimeout(resolve, 500))
|
|
|
+ await new Promise((resolve) => setTimeout(resolve, 500))
|
|
|
return true
|
|
|
} catch (error) {
|
|
|
throw error
|
|
@@ -437,6 +477,5 @@ export default defineContentScript({
|
|
|
|
|
|
return `${year}-${month}-${day}`
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
})
|