Skip to content

Commit

Permalink
feat: 添加任务点是否完成检测,不重复执行已完成任务点, 修复判断题不选择的BUG
Browse files Browse the repository at this point in the history
  • Loading branch information
enncy committed Mar 30, 2022
1 parent cef6bac commit dbc1a86
Show file tree
Hide file tree
Showing 11 changed files with 91 additions and 48 deletions.
4 changes: 2 additions & 2 deletions packages/scripts/src/browser/core/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,11 @@ export function addFunctionEventListener(obj: any, type: string) {
* @param str
* @returns
*/
export function clearString(str: string) {
export function clearString(str: string, ...exclude: string[]) {
return str
.trim()
.toLocaleLowerCase()
.replace(/[^\u4e00-\u9fa5A-Za-z0-9]*/g, "");
.replace(RegExp(`[^\\u4e00-\\u9fa5A-Za-z0-9${exclude.join("")}]*`, "g"), "");
}

/**
Expand Down
2 changes: 2 additions & 0 deletions packages/scripts/src/browser/core/worker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ export class OCSWorker<E extends RawElements = RawElements> {
/** dom 搜索 */
const elements: WorkContext<E>["elements"] = domSearchAll<E>(this.opts.elements, el);

this.opts.onElementSearched?.(elements);

/** 改变上下文 */
this.currentContext = { searchResults: [], root: el, elements };

Expand Down
2 changes: 2 additions & 0 deletions packages/scripts/src/browser/core/worker/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ export type WorkOptions<E extends RawElements> = {
retry?: number;
/** 监听答题结果 */
onResult?: (res: WorkResult<E>) => void;
/** 当元素被搜索到的处理器 */
onElementSearched?: (elements: SearchedElements<E, HTMLElement[]>) => void;
/** 监听错误事件 */
onError?: (e: Error, ctx?: WorkContext<E>) => void;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ export function defaultQuestionResolve<E>(
}

function matches(target: string, options: string[]) {
return options.map((option) => RegExp(clearString(option)).test(clearString(target)));
return options.some((option) =>
RegExp(clearString(option, "√", "×")).test(clearString(target, "√", "×"))
);
}
}

Expand Down
52 changes: 38 additions & 14 deletions packages/scripts/src/browser/cx/study.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ export async function study(setting: ScriptSettings["cx"]["video"]) {
function searchTask(setting: ScriptSettings["cx"]["video"]): Array<() => Promise<number>> {
return searchIFrame()
.map((frame) => () => {
const data = JSON.parse(frame.getAttribute("data") || "{}");
// @ts-ignore
const attachments = frame.contentWindow?.parent.attachments as any[];

const { media, ppt, chapterTest } = domSearch(
{
media: "video,audio",
Expand All @@ -48,16 +52,26 @@ function searchTask(setting: ScriptSettings["cx"]["video"]): Array<() => Promise
frame.contentDocument || document
);

// @ts-ignore
// console.log("data", { frame }, unsafeWindow.attachments[0]);
/** 如果是任务点, 并且 未完成或者复习模式 */
if (
attachments?.some((atta) => atta?.jobid === data?.jobid && (atta.job === true || setting.restudy)) ||
chapterTest?.querySelector('input[type="checkbox"],input[type="radio"]')
) {
const name = media ? "视频/音频" : ppt ? "ppt" : chapterTest ? "章节测试" : "任务";
logger("info", `${name}开始:` + data?.name ? data.name : data?.title ? data.title : "未知的任务名");

return media
? mediaTask(setting, media as any)
: ppt
? pptTask(frame)
: chapterTest
? chapterTestTask(OCS.setting.cx.work, frame)
: undefined;
} else {
console.log(frame);

return media
? mediaTask(setting, media as any)
: ppt
? pptTask(frame)
: chapterTest
? chapterTestTask(OCS.setting.cx.work, frame)
: undefined;
logger("info", `${data?.name || data?.title || "未知任务点"} 已完成,即将跳过`);
}
})
.filter((t) => t !== undefined) as any;
}
Expand Down Expand Up @@ -90,8 +104,6 @@ function searchIFrame() {
* 播放视频和音频
*/
function mediaTask(setting: ScriptSettings["cx"]["video"], media: HTMLMediaElement) {
logger("info", "开始自动播放");

const { playbackRate = 1, mute = true } = setting;
return new Promise<void>((resolve) => {
if (media) {
Expand All @@ -117,8 +129,6 @@ function mediaTask(setting: ScriptSettings["cx"]["video"], media: HTMLMediaEleme
* 阅读 ppt
*/
async function pptTask(frame?: HTMLIFrameElement) {
logger("info", "开始翻页PPT");

// @ts-ignore
let finishJob = frame?.contentWindow?.finishJob;
if (finishJob) finishJob();
Expand Down Expand Up @@ -176,6 +186,19 @@ async function chapterTestTask(setting: ScriptSettings["cx"]["work"], frame: HTM
throw new Error("题目为空,请查看题目是否为空,或者忽略此题");
}
},
/** 处理cx作业判断题选项是图片的问题 */
onElementSearched(elements) {
const typeInput = elements.type[0] as HTMLInputElement;
const type = parseInt(typeInput.value);
if (type === 3) {
elements.options.forEach((option) => {
const ri = option.querySelector(".ri");
const span = document.createElement("span");
span.innerText = ri ? "√" : "×";
option.appendChild(span);
});
}
},
work: {
/**
* cx 题目类型 :
Expand Down Expand Up @@ -204,7 +227,8 @@ async function chapterTestTask(setting: ScriptSettings["cx"]["work"], frame: HTM
handler(type, answer, option) {
if (type === "judgement" || type === "single" || type === "multiple") {
if (!option.querySelector("input")?.checked) {
option.querySelector("a")?.click();
// @ts-ignore
option.querySelector("a,label")?.click();
}
} else if (type === "completion" && answer.trim()) {
const text = option.querySelector("textarea");
Expand Down
13 changes: 13 additions & 0 deletions packages/scripts/tests/js/question.resolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { defaultQuestionResolve } from "../../src/browser/core/worker/question.resolver";

const resolvers = defaultQuestionResolve({} as any);

const res = resolvers["judgement"](
[{ answers: [{ answer: "True", question: "" }] } as any],
[{ innerText: "√" } as any, { innerText: "×" } as any],
(type, answer, option, ctx) => {
console.log({ type, answer, option, ctx });
}
);

console.log(res);
16 changes: 16 additions & 0 deletions packages/scripts/tests/playwright/cx/login.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { test } from "@playwright/test";
import { CX } from "../../../src";

import config from "../../local.config";

test("school login", async ({ page }) => {
await CX.schoolLogin(page, config.cx.login.school);
});

test("phone login", async ({ page }) => {
await CX.phoneLogin(page, config.cx.login.phone);
});

test("other login", async ({ page }) => {
await CX.otherLogin(page, config.cx.login.other);
});
File renamed without changes.
15 changes: 15 additions & 0 deletions packages/scripts/tests/playwright/zhs/login.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { test } from "@playwright/test";
import { ZHS } from "../../../src";
import config from "../../local.config";

test("phone login", async ({ page }) => {
await ZHS.phoneLogin(page, config.zhs.login.phone);
});

test("school login", async ({ page }) => {
await ZHS.schoolLogin(page, config.zhs.login.school);
});

test("other login", async ({ page }) => {
await ZHS.otherLogin(page, config.zhs.login.other);
});
16 changes: 0 additions & 16 deletions packages/scripts/tests/puppeteer/cx/login.spec.ts

This file was deleted.

15 changes: 0 additions & 15 deletions packages/scripts/tests/puppeteer/zhs/login.spec.ts

This file was deleted.

0 comments on commit dbc1a86

Please sign in to comment.