skopix 2.0.91 → 2.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4334,25 +4334,37 @@ async function startStepTester(testerId, url, selector, mode, steps) {
4334
4334
  if (mode === 'preview' && steps && steps.length > 0) {
4335
4335
  // Register expose functions FIRST before addInitScript so they're available on DOMContentLoaded
4336
4336
  await ctx.exposeFunction('__skopixPreviewRun', async ({ index }) => {
4337
+ const session = stepTesterSessions.get(testerId);
4338
+ if (!session) return;
4337
4339
  const s = steps[index];
4338
4340
  if (!s) return;
4339
4341
  await page.evaluate(({ i, status }) => { if(window.__skopixUpdatePreview) window.__skopixUpdatePreview(i, null, status); }, { i: index, status: `Running step ${index+1}/${steps.length}...` }).catch(()=>{});
4340
4342
  const result = await executeStepTesterAction(page, { selector: s.stableSelector||s.selector, action: s.action, value: s.value||'', assertType: s.assertType });
4341
4343
  const msg = result.passed ? (index+1 >= steps.length ? `✓ All ${steps.length} steps passed!` : `✓ Step ${index+1} passed`) : `✗ Step ${index+1} failed`;
4342
- await page.evaluate(({ i, r, msg }) => {
4344
+ if (result.passed) session.currentStep = index + 1;
4345
+ if (!session.results) session.results = {};
4346
+ session.results[index] = { passed: result.passed, error: result.error||null };
4347
+ await page.evaluate(({ i, r, msg, currentStep }) => {
4343
4348
  if(window.__skopixUpdatePreview) window.__skopixUpdatePreview(i, r, msg);
4344
- }, { i: index, r: { passed: result.passed, error: result.error||null }, msg }).catch(()=>{});
4349
+ window.__skopixPreviewCurrentStep = currentStep;
4350
+ }, { i: index, r: { passed: result.passed, error: result.error||null }, msg, currentStep: session.currentStep || 0 }).catch(()=>{});
4345
4351
  });
4346
4352
 
4347
4353
  await ctx.exposeFunction('__skopixPreviewRunAll', async ({ fromIndex }) => {
4354
+ const session = stepTesterSessions.get(testerId);
4355
+ if (!session) return;
4348
4356
  for (let i = fromIndex; i < steps.length; i++) {
4349
4357
  const s = steps[i];
4350
4358
  await page.evaluate(({ i, total }) => { if(window.__skopixUpdatePreview) window.__skopixUpdatePreview(i, null, `Running step ${i+1}/${total}...`); }, { i, total: steps.length }).catch(()=>{});
4351
4359
  const result = await executeStepTesterAction(page, { selector: s.stableSelector||s.selector, action: s.action, value: s.value||'', assertType: s.assertType });
4360
+ if (result.passed) session.currentStep = i + 1;
4361
+ if (!session.results) session.results = {};
4362
+ session.results[i] = { passed: result.passed, error: result.error||null };
4352
4363
  const msg = result.passed ? (i+1 >= steps.length ? `✓ All ${steps.length} steps passed!` : `Running...`) : `✗ Step ${i+1} failed — fix and retry`;
4353
- await page.evaluate(({ i, r, msg }) => {
4364
+ await page.evaluate(({ i, r, msg, currentStep }) => {
4354
4365
  if(window.__skopixUpdatePreview) window.__skopixUpdatePreview(i, r, msg);
4355
- }, { i, r: { passed: result.passed, error: result.error||null }, msg }).catch(()=>{});
4366
+ window.__skopixPreviewCurrentStep = currentStep;
4367
+ }, { i, r: { passed: result.passed, error: result.error||null }, msg, currentStep: session.currentStep || 0 }).catch(()=>{});
4356
4368
  if (!result.passed) break;
4357
4369
  await new Promise(r => setTimeout(r, 400));
4358
4370
  }
@@ -4363,6 +4375,11 @@ async function startStepTester(testerId, url, selector, mode, steps) {
4363
4375
  stepTesterSessions.delete(testerId);
4364
4376
  });
4365
4377
 
4378
+ await ctx.exposeFunction('__skopixGetState', async () => {
4379
+ const session = stepTesterSessions.get(testerId);
4380
+ return { currentStep: session?.currentStep || 0, results: session?.results || {} };
4381
+ });
4382
+
4366
4383
  // THEN inject toolbar via addInitScript
4367
4384
  // PREVIEW MODE — inject steps list toolbar
4368
4385
  await ctx.addInitScript((stepsData) => {
@@ -4456,6 +4473,17 @@ async function startStepTester(testerId, url, selector, mode, steps) {
4456
4473
  if (window.__skopixStopPreview) window.__skopixStopPreview({});
4457
4474
  });
4458
4475
 
4476
+ // Restore state from server after navigation
4477
+ if (window.__skopixGetState) {
4478
+ window.__skopixGetState({}).then(state => {
4479
+ if (state && state.currentStep > 0) {
4480
+ window.__skopixPreviewCurrentStep = state.currentStep;
4481
+ window.__skopixPreviewResults = state.results || {};
4482
+ renderSteps(state.currentStep, state.results || {});
4483
+ }
4484
+ }).catch(() => {});
4485
+ }
4486
+
4459
4487
  window.__skopixUpdatePreview = (index, result, status) => {
4460
4488
  window.__skopixPreviewResults[index] = result;
4461
4489
  if (result && result.passed) window.__skopixPreviewCurrentStep = index + 1;
@@ -4578,7 +4606,7 @@ async function startStepTester(testerId, url, selector, mode, steps) {
4578
4606
  if (url) await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => {});
4579
4607
  // Ensure toolbar is injected on first page (DOMContentLoaded may have already fired)
4580
4608
  await page.evaluate(() => { if (window.__skopixTesterSelector !== undefined && !document.getElementById('__skopix_tester') && !document.getElementById('__skopix_preview')) { document.dispatchEvent(new Event('DOMContentLoaded')); } }).catch(() => {});
4581
- stepTesterSessions.set(testerId, { browser, ctx, page });
4609
+ stepTesterSessions.set(testerId, { browser, ctx, page, currentStep: 0, results: {} });
4582
4610
  }
4583
4611
 
4584
4612
  async function executeStepTesterAction(page, { selector, action, value }) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skopix",
3
- "version": "2.0.91",
3
+ "version": "2.0.92",
4
4
  "description": "Browser-based QA tool — record tests by using your app, replay them deterministically, generate Playwright code automatically",
5
5
  "main": "cli/index.js",
6
6
  "bin": {