|
@@ -1,5 +1,6 @@
|
|
|
// entrypoints/content.ts
|
|
|
import PageAnalyzer, { cleanPage } from '../utils/page-analyzer'
|
|
|
+import html2canvas from 'html2canvas'
|
|
|
import {
|
|
|
formatDate,
|
|
|
simulateCompleteUserAction,
|
|
@@ -10,9 +11,11 @@ import {
|
|
|
findLabelForTextarea,
|
|
|
getPageInfo
|
|
|
} from '../utils/contentUtils'
|
|
|
+import { defineContentScript } from 'wxt/sandbox'
|
|
|
+import { domToCanvas } from '@/entrypoints/sidepanel/utils/index.js'
|
|
|
+
|
|
|
export default defineContentScript({
|
|
|
- matches: ['<all_urls>'],
|
|
|
- main(ctx) {
|
|
|
+ matches: ['<all_urls>'], main(ctx) {
|
|
|
let page = document.getElementsByTagName('body')[0]
|
|
|
const src = chrome.runtime.getURL('images/begin.png')
|
|
|
window.pageAnalyzer = new PageAnalyzer()
|
|
@@ -23,117 +26,124 @@ export default defineContentScript({
|
|
|
let form = null
|
|
|
let formChildren = []
|
|
|
let excelDataA = {}
|
|
|
- chrome.runtime.onMessage.addListener(
|
|
|
- async (message, sender, sendResponse) => {
|
|
|
- if (message.type === 'GET_PAGE_INFO') {
|
|
|
+ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
|
+ if (message.type === 'GET_PAGE_INFO') {
|
|
|
+ sendResponse({
|
|
|
+ data: getPageInfo()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ let dom = null
|
|
|
+ if (message.type === 'GET_TAG_ACTION') {
|
|
|
+ console.log(message.data)
|
|
|
+ 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: '完成' })
|
|
|
+ }
|
|
|
+ if (message.type === 'GET_PAGE_FORM') {
|
|
|
+ const forms = document.querySelectorAll('form')
|
|
|
+ if (forms.length === 0) {
|
|
|
sendResponse({
|
|
|
- data: getPageInfo()
|
|
|
+ status: 'error', message: '没有找到表单'
|
|
|
})
|
|
|
+ return
|
|
|
}
|
|
|
- let dom = null
|
|
|
- if (message.type === 'GET_TAG_ACTION') {
|
|
|
- console.log(message.data)
|
|
|
- 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: '完成' })
|
|
|
+ if (forms.length === 1) {
|
|
|
+ form = forms[0]
|
|
|
+ const cloneForm = forms[0].cloneNode(true)
|
|
|
+ cloneForm.querySelectorAll('svg').forEach((el) => el.remove())
|
|
|
+ formChildren = [...form.elements]
|
|
|
+ sendResponse({
|
|
|
+ status: 'ok', data: cloneForm.outerHTML
|
|
|
+ })
|
|
|
+ return
|
|
|
}
|
|
|
- if (message.type === 'GET_PAGE_FORM') {
|
|
|
- const forms = document.querySelectorAll('form')
|
|
|
- if (forms.length === 0) {
|
|
|
- sendResponse({
|
|
|
- status: 'error',
|
|
|
- message: '没有找到表单'
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
- if (forms.length === 1) {
|
|
|
- form = forms[0]
|
|
|
- const cloneForm = forms[0].cloneNode(true)
|
|
|
+ sendResponse({
|
|
|
+ status: 'select'
|
|
|
+ })
|
|
|
+ for (const item of forms) {
|
|
|
+ item.style.border = '2px solid red'
|
|
|
+
|
|
|
+ function handleClick(e) {
|
|
|
+ e.stopPropagation()
|
|
|
+ console.log(this.outerHTML)
|
|
|
+ for (const form of forms) {
|
|
|
+ form.style.border = 'none'
|
|
|
+ form.removeEventListener('click', handleClick, true)
|
|
|
+ }
|
|
|
+ form = this
|
|
|
+ console.log(form, 5855)
|
|
|
+ const cloneForm = this.cloneNode(true)
|
|
|
cloneForm.querySelectorAll('svg').forEach((el) => el.remove())
|
|
|
formChildren = [...form.elements]
|
|
|
- sendResponse({
|
|
|
- status: 'ok',
|
|
|
- data: cloneForm.outerHTML
|
|
|
+ // sendResponse({
|
|
|
+ // type: 'FROM_CONTENT_TO_SEND_PAGE_FORM',
|
|
|
+ // data: this.outerHTML
|
|
|
+ // })
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ type: 'FROM_CONTENT_TO_SEND_PAGE_FORM', data: cloneForm.outerHTML
|
|
|
})
|
|
|
- return
|
|
|
- }
|
|
|
- sendResponse({
|
|
|
- status: 'select'
|
|
|
- })
|
|
|
- for (const item of forms) {
|
|
|
- item.style.border = '2px solid red'
|
|
|
- function handleClick(e) {
|
|
|
- e.stopPropagation()
|
|
|
- console.log(this.outerHTML)
|
|
|
- for (const form of forms) {
|
|
|
- form.style.border = 'none'
|
|
|
- form.removeEventListener('click', handleClick, true)
|
|
|
- }
|
|
|
- form = this
|
|
|
- console.log(form, 5855)
|
|
|
- const cloneForm = this.cloneNode(true)
|
|
|
- cloneForm.querySelectorAll('svg').forEach((el) => el.remove())
|
|
|
- formChildren = [...form.elements]
|
|
|
- // sendResponse({
|
|
|
- // type: 'FROM_CONTENT_TO_SEND_PAGE_FORM',
|
|
|
- // data: this.outerHTML
|
|
|
- // })
|
|
|
- chrome.runtime.sendMessage({
|
|
|
- type: 'FROM_CONTENT_TO_SEND_PAGE_FORM',
|
|
|
- data: cloneForm.outerHTML
|
|
|
- })
|
|
|
- }
|
|
|
- item.addEventListener('click', handleClick, true)
|
|
|
}
|
|
|
- // if (!form) {
|
|
|
- // sendResponse({
|
|
|
- // status: 'error',
|
|
|
- // message: '没有找到表单'
|
|
|
- // })
|
|
|
- // return
|
|
|
- // }
|
|
|
- // sendResponse({
|
|
|
- // status: 'ok',
|
|
|
- // data: form.outerHTML
|
|
|
- // })
|
|
|
- // 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) }
|
|
|
- // }
|
|
|
+ item.addEventListener('click', handleClick, true)
|
|
|
}
|
|
|
- if (message.type === 'INPUT_FORM') {
|
|
|
- const { formData, excelData } = message.data
|
|
|
- excelDataA = excelData
|
|
|
- console.log(formData, excelDataA)
|
|
|
+ // if (!form) {
|
|
|
+ // sendResponse({
|
|
|
+ // status: 'error',
|
|
|
+ // message: '没有找到表单'
|
|
|
+ // })
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // sendResponse({
|
|
|
+ // status: 'ok',
|
|
|
+ // data: form.outerHTML
|
|
|
+ // })
|
|
|
+ // 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 (message.type === 'INPUT_FORM') {
|
|
|
+ const { formData, excelData } = message.data
|
|
|
+ excelDataA = excelData
|
|
|
+ console.log('12',formData, excelDataA)
|
|
|
+ (async () => {
|
|
|
await handleFillInput(formData, 0)
|
|
|
- }
|
|
|
+ })()
|
|
|
+ }
|
|
|
+ if (message.type === 'SCREENSHOT') {
|
|
|
+ domToCanvas().then(res => {
|
|
|
+ sendResponse({ status: 'ok', data: res })
|
|
|
+ }).catch(err => {
|
|
|
+ sendResponse({ status: 'error', message: err })
|
|
|
+ })
|
|
|
return true
|
|
|
}
|
|
|
- )
|
|
|
+ return true
|
|
|
+ })
|
|
|
const handleFillInput = async (data, index) => {
|
|
|
console.log(data, 85888)
|
|
|
console.log(formChildren, form)
|
|
@@ -141,19 +151,11 @@ 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))
|
|
|
console.log(item, label)
|
|
|
if (label) {
|
|
|
const input = findLabelForInput(label)
|
|
@@ -169,48 +171,32 @@ 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.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') {
|
|
@@ -221,10 +207,7 @@ export default defineContentScript({
|
|
|
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()
|
|
|
}
|
|
@@ -238,23 +221,11 @@ 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)
|