@@ -5,7 +5,8 @@ const path = require("path");
55const _ = require ( "lodash" ) ;
66const { pngValidator : validatePng } = require ( "png-validator" ) ;
77const { Image } = require ( "../../../image" ) ;
8- const { ScreenShooter } = require ( "../../screen-shooter" ) ;
8+ const { ElementsScreenShooter } = require ( "../../screen-shooter/elements-screen-shooter" ) ;
9+ const { ViewportScreenShooter } = require ( "../../screen-shooter/viewport-screen-shooter" ) ;
910const temp = require ( "../../../temp" ) ;
1011const { getCaptureProcessors } = require ( "./capture-processors" ) ;
1112const RuntimeConfig = require ( "../../../config/runtime-config" ) ;
@@ -31,7 +32,21 @@ const getIgnoreDiffPixelCountRatio = value => {
3132} ;
3233
3334module . exports . default = browser => {
34- const screenShooter = ScreenShooter . create ( browser ) ;
35+ const browserProperties = {
36+ isWebdriverProtocol : browser . isWebdriverProtocol ,
37+ shouldUsePixelRatio : browser . shouldUsePixelRatio ,
38+ needsCompatLib : browser . needsCompatLib ,
39+ } ;
40+ const screenShooterPromise = ElementsScreenShooter . create ( {
41+ camera : browser . camera ,
42+ browser : browser . publicAPI ,
43+ browserProperties,
44+ } ) ;
45+ const viewportScreenShooterPromise = ViewportScreenShooter . create ( {
46+ camera : browser . camera ,
47+ browser : browser . publicAPI ,
48+ browserProperties,
49+ } ) ;
3550 const { publicAPI : session , config } = browser ;
3651 const {
3752 assertViewOpts,
@@ -45,28 +60,20 @@ module.exports.default = browser => {
4560
4661 const { handleNoRefImage, handleImageDiff, handleInvalidRefImage } = getCaptureProcessors ( ) ;
4762
48- const assertView = async ( state , selectors , opts ) => {
49- opts = _ . defaults ( opts , assertViewOpts , {
63+ const getDefaultOpts = opts =>
64+ _ . defaults ( opts , assertViewOpts , {
5065 compositeImage,
5166 screenshotDelay,
5267 tolerance,
5368 antialiasingTolerance,
5469 disableAnimation,
5570 } ) ;
5671
72+ const compareScreenshot = async ( state , currImgInst , currImgMeta , opts ) => {
5773 const { testplaneCtx } = session . executionContext ;
5874 const test = session . executionContext . ctx . currentTest ;
5975 testplaneCtx . assertViewResults = testplaneCtx . assertViewResults || AssertViewResults . create ( ) ;
6076
61- let debugId = "debugId" ;
62- try {
63- debugId = `${ test . fullTitle ( ) } .${ browser . id } .${ state } ` ;
64- } catch {
65- /**/
66- }
67- debug ( `[${ debugId } ] assertView selectors: %O` , selectors ) ;
68- debug ( `[${ debugId } ] assertView opts: %O` , opts ) ;
69-
7077 if ( testplaneCtx . assertViewResults . hasState ( state ) ) {
7178 return Promise . reject ( new AssertViewError ( `duplicate name for "${ state } " state` ) ) ;
7279 }
@@ -77,7 +84,6 @@ module.exports.default = browser => {
7784 const { tempOpts } = RuntimeConfig . getInstance ( ) ;
7885 temp . attach ( tempOpts ) ;
7986
80- const { image : currImgInst , meta : currImgMeta } = await screenShooter . capture ( selectors , opts ) ;
8187 const currSize = await currImgInst . getSize ( ) ;
8288 const currImg = { path : temp . path ( Object . assign ( tempOpts , { suffix : ".png" } ) ) , size : currSize } ;
8389
@@ -153,11 +159,44 @@ module.exports.default = browser => {
153159 testplaneCtx . assertViewResults . add ( { stateName : state , refImg : refImg } ) ;
154160 } ;
155161
162+ const assertView = async ( state , selectors , opts ) => {
163+ opts = getDefaultOpts ( opts ) ;
164+
165+ let debugId = "debugId" ;
166+ try {
167+ const test = session . executionContext . ctx . currentTest ;
168+ debugId = `${ test . fullTitle ( ) } .${ browser . id } .${ state } ` ;
169+ opts . debugId = debugId ;
170+ } catch {
171+ /**/
172+ }
173+ debug ( `[${ debugId } ] assertView selectors: %O` , selectors ) ;
174+ debug ( `[${ debugId } ] assertView opts: %O` , opts ) ;
175+
176+ const screenShooter = await screenShooterPromise ;
177+ const { image, meta } = await screenShooter . capture ( selectors , opts ) ;
178+
179+ return compareScreenshot ( state , image , meta , opts ) ;
180+ } ;
181+
182+ const PSEUDO_SELECTOR_REGEXP = / ( .* ?) ( : : b e f o r e | : : a f t e r ) \s * $ / i;
183+ const getSelectorToWaitForExist = selector => {
184+ if ( ! _ . isString ( selector ) ) {
185+ return selector ;
186+ }
187+ const match = selector . match ( PSEUDO_SELECTOR_REGEXP ) ;
188+ if ( ! match ) {
189+ return selector ;
190+ }
191+ const elementSelector = match [ 1 ] . trim ( ) ;
192+ return elementSelector || selector ;
193+ } ;
194+
156195 const waitSelectorsForExist = async ( browser , selectors ) => {
157196 await Promise . all (
158197 [ ] . concat ( selectors ) . map ( selector =>
159198 browser
160- . $ ( selector )
199+ . $ ( getSelectorToWaitForExist ( selector ) )
161200 . then ( el => el . waitForExist ( ) )
162201 . catch ( ( ) => {
163202 throw new Error (
@@ -175,13 +214,14 @@ module.exports.default = browser => {
175214 } ;
176215
177216 const assertViewByViewport = async ( state , opts ) => {
178- opts = Object . assign ( opts , {
179- allowViewportOverflow : true ,
180- compositeImage : false ,
181- captureElementFromTop : false ,
182- } ) ;
217+ opts = getDefaultOpts ( opts ) ;
218+
219+ debug ( `assertViewByViewport state: ${ state } , opts: %O` , opts ) ;
220+
221+ const vpScreenShooter = await viewportScreenShooterPromise ;
222+ const { image, meta } = await vpScreenShooter . capture ( opts ) ;
183223
184- return assertView ( state , "body" , opts ) ;
224+ return compareScreenshot ( state , image , meta , opts ) ;
185225 } ;
186226
187227 const shouldAssertViewport = selectorsOrOpts => {
0 commit comments