fix: resume video playback and advance linked exams with attempt controls
This commit is contained in:
@@ -44,6 +44,7 @@ async function main() {
|
||||
const pane = document.createElement('div'); pane.className = 'cdk-overlay-pane question-modal-pc';
|
||||
const texts = ['任意操作', '切换 mPa 单位', '保持 MPa 单位并核对'];
|
||||
pane.innerHTML = '<div class="question"><div class="question_box fade_in"><div class="modal-dialog"><div class="modal-content"><div class="modal-body"><div class="examtest_content_question"><p class="show"><span>[单选]</span>压力达到 2 MPa 时应该怎样操作?</p><p class="hidden">[多选]隐藏模板</p><p class="hidden">[判断]隐藏模板</p></div><div class="examtest_content_list">' + texts.map((text, index) => '<div class="option-row"><div class="examtest_content_list_des"><div><span class="examtest_content_list_des_optionsort">' + String.fromCharCode(65 + index) + '</span>' + text + '</div></div></div>').join('') + '</div></div><div class="modal-footer"></div></div></div></div></div>';
|
||||
pane.insertAdjacentHTML('afterbegin', '<p class="attempt-status">允许答题次数:1次</p>');
|
||||
document.querySelector('.cdk-overlay-container').append(pane);
|
||||
const grade = () => {
|
||||
qaQuiz.submits++;
|
||||
@@ -74,17 +75,47 @@ async function main() {
|
||||
await YianAssistant.setLearningSetting('mode', 'videoQuiz');
|
||||
await YianAssistant.setLearningSetting('rate', 2);
|
||||
await YianAssistant.setLearningSetting('answerInterval', 0);
|
||||
window.qaResume = { continued: 0, restarted: 0 };
|
||||
const dialog = document.createElement('div'); dialog.className = 'modal-dialog dialog_box';
|
||||
dialog.innerHTML = '<div class="modal-content"><div class="modal-body modal-dialog-scrollable"><div>是否继续上次播放的位置?</div></div><div class="modal-footer"><button type="button"><span aria-hidden="true">重新开始</span></button><button type="button"><span aria-hidden="true">继续播放</span></button></div></div>';
|
||||
const buttons = dialog.querySelectorAll('button');
|
||||
buttons[0].onclick = () => { qaResume.restarted++; qaMedia.currentTime = 0; dialog.remove(); };
|
||||
buttons[1].onclick = () => { qaResume.continued++; qaMedia.currentTime = 37.5; dialog.remove(); };
|
||||
document.querySelector('.cdk-overlay-container').append(dialog);
|
||||
await YianAssistant.taskAction('start');
|
||||
});
|
||||
await page.waitForFunction(() => YianAssistant.getLearningState().status === 'running' && !qaMedia.paused && qaMedia.playbackRate === 2);
|
||||
assert.equal(await page.evaluate(() => YianAssistant.getLearningState().total), 1);
|
||||
assert.equal(await page.evaluate(() => YianAssistant.getLearningState().completed), 0);
|
||||
assert.deepEqual(await page.evaluate(() => qaResume), { continued: 1, restarted: 0 });
|
||||
assert.equal(await page.evaluate(() => qaMedia.currentTime), 37.5);
|
||||
console.log('PASS 完整 bundle:无岗位题库导入、videoQuiz 调度、独立播放器真实 2X 状态');
|
||||
|
||||
await page.evaluate(() => {
|
||||
window.qaVisibility = 'hidden'; Object.defineProperty(document, 'visibilityState', { configurable: true, get: () => qaVisibility });
|
||||
document.dispatchEvent(new Event('visibilitychange')); document.querySelector('video').pause();
|
||||
});
|
||||
await page.waitForFunction(() => YianAssistant.getLearningState().video.status === 'backgroundPaused');
|
||||
const visibilityPlays = await page.evaluate(() => qaMedia.playCalls);
|
||||
await page.evaluate(() => { qaVisibility = 'visible'; document.dispatchEvent(new Event('visibilitychange')); });
|
||||
await page.waitForFunction(() => !qaMedia.paused);
|
||||
assert.equal(await page.evaluate(() => qaMedia.playCalls), visibilityPlays + 1);
|
||||
assert.equal(await page.evaluate(() => qaMedia.currentTime), 37.5);
|
||||
console.log('PASS 精确续播弹窗选择继续播放;网站后台暂停后返回立即续播,保留37.5秒实际位置');
|
||||
|
||||
const beforeTabs = await page.evaluate(() => ({ plays: qaMedia.playCalls, pauses: qaMedia.pauseCalls, task: YianAssistant.getLearningState().tasks[0].id }));
|
||||
for (const key of ['overview', 'video', 'exam', 'bank', 'console', 'settings', 'video']) await host.getByTestId('tab-' + key).click();
|
||||
const afterTabs = await page.evaluate(() => ({ plays: qaMedia.playCalls, pauses: qaMedia.pauseCalls, task: YianAssistant.getLearningState().tasks[0].id }));
|
||||
assert.deepEqual(afterTabs, beforeTabs, '切栏不得重新播放、暂停或领取新任务');
|
||||
await page.evaluate(() => { qaShowQuiz(); });
|
||||
await page.waitForFunction(() => YianAssistant.getLearningState().tasks[0].status === 'waiting');
|
||||
assert.equal(await page.evaluate(() => qaQuiz.clicks.length + qaQuiz.submits + qaQuiz.closes), 0, '默认单次机会开关阻止选项/判分/关闭');
|
||||
assert.match(await page.evaluate(() => YianAssistant.getLearningState().tasks[0].reason), /1 次/);
|
||||
await host.getByTestId('setting-skipSingleAttemptQuiz').uncheck();
|
||||
await page.waitForFunction(() => !YianAssistant.getLearningState().skipSingleAttemptQuiz && YianAssistant.getLearningState().status === 'paused');
|
||||
assert.equal(await page.evaluate(() => qaQuiz.clicks.length + qaQuiz.submits + qaQuiz.closes), 0, '关闭开关不立即作答,需明确继续');
|
||||
await page.evaluate(async () => { document.querySelector('.question-modal-pc').remove(); await YianAssistant.taskAction('resume'); });
|
||||
await page.waitForFunction(() => !qaMedia.paused);
|
||||
await host.getByTestId('global-pause').click();
|
||||
await page.waitForFunction(() => YianAssistant.getLearningState().status === 'paused' && qaMedia.paused);
|
||||
await page.evaluate(async () => {
|
||||
@@ -137,6 +168,20 @@ async function main() {
|
||||
assert(await host.getByTestId('pane-video').textContent().then(text => text.includes('已确认完成')), '视频栏必须同步平台已完成状态');
|
||||
assert.equal(requests.length, 1); assert.deepEqual(blocked, []); assert.deepEqual(errors, []);
|
||||
assert.equal(await page.locator('vite-error-overlay,nextjs-portal,#webpack-dev-server-client-overlay').count(), 0);
|
||||
await host.getByTestId('tab-video').click();
|
||||
await page.screenshot({ path: path.join(qaDir, '03-playback-switches-desktop.png') });
|
||||
await page.setViewportSize({ width: 390, height: 844 });
|
||||
await host.getByTestId('setting-resumePlaybackOnReturn').scrollIntoViewIfNeeded();
|
||||
await page.screenshot({ path: path.join(qaDir, '04-playback-switches-mobile.png') });
|
||||
await host.getByTestId('setting-autoContinuePlayback').uncheck();
|
||||
await host.getByTestId('setting-resumePlaybackOnReturn').uncheck();
|
||||
await page.waitForFunction(() => !YianAssistant.getLearningState().autoContinuePlayback && !YianAssistant.getLearningState().resumePlaybackOnReturn);
|
||||
await page.reload(); await page.addScriptTag({ content: sandbox }); await page.evaluate(() => YianAssistant.ready);
|
||||
const restored = await page.evaluate(() => YianAssistant.getLearningState());
|
||||
for (const key of ['autoContinuePlayback', 'resumePlaybackOnReturn', 'skipSingleAttemptQuiz']) assert.equal(restored[key], false, key + ' 刷新保存');
|
||||
assert.equal(restored.status, 'paused');
|
||||
assert.deepEqual(errors, []);
|
||||
console.log('PASS 单次机会保护ON/OFF真实开关与显式继续、全部三开关保存/刷新不自启、桌面/390px窄屏');
|
||||
console.log('PASS 视频末尾等待平台;明确 data-is-learned 后完成任务并更新面板;零业务网络/刷新、无控制台错误');
|
||||
console.log('截图:' + qaDir);
|
||||
} finally { await browser.close(); }
|
||||
|
||||
Reference in New Issue
Block a user