1010import org .openqa .selenium .Point ;
1111import util .driver .PageValidator ;
1212import util .general .HtmlReportBuilder ;
13- import util .general .SystemHelper ;
1413
1514import javax .imageio .ImageIO ;
1615import java .awt .*;
2423import java .util .concurrent .atomic .AtomicLong ;
2524
2625import static environment .EnvironmentFactory .isChrome ;
26+ import static environment .EnvironmentFactory .isMobile ;
2727import static util .general .SystemHelper .isAutomotionFolderExists ;
2828import static util .general .SystemHelper .isRetinaDisplay ;
2929import static util .validator .Constants .*;
@@ -44,6 +44,7 @@ public class ResponsiveUIValidator {
4444 private static File screenshot ;
4545 private static BufferedImage img ;
4646 private static Graphics2D g ;
47+ private static JSONArray errorMessage ;
4748 String rootElementReadableName = "Root Element" ;
4849 List <WebElement > rootElements ;
4950 boolean drawLeftOffsetLine = false ;
@@ -57,9 +58,6 @@ public class ResponsiveUIValidator {
5758 int heightRoot ;
5859 int pageWidth ;
5960 int pageHeight ;
60- int rootElementRightOffset ;
61- int rootElementBottomOffset ;
62- private JSONArray errorMessage ;
6361
6462 public ResponsiveUIValidator (WebDriver driver ) {
6563 ResponsiveUIValidator .driver = driver ;
@@ -206,13 +204,7 @@ void drawScreenshot() {
206204
207205 g .setColor (highlightedElementsColor );
208206 g .setStroke (new BasicStroke (2 ));
209- if (isRetinaDisplay () && isChrome ()) {
210- g .drawRect (2 * (int ) x , 2 * (int ) y , 2 * (int ) width , 2 * (int ) height );
211- //g.fillRect(2 * (int) x, 2 * (int) y, 2 * (int) width, 2 * (int) height);
212- } else {
213- g .drawRect ((int ) x , (int ) y , (int ) width , (int ) height );
214- //g.fillRect(2 * (int) x, 2 * (int) y, 2 * (int) width, 2 * (int) height);
215- }
207+ g .drawRect (getRetinaValue ((int ) x ), getRetinaValue ((int ) y ), getRetinaValue ((int ) width ), getRetinaValue ((int ) height ));
216208 }
217209 }
218210
@@ -351,6 +343,8 @@ void validateOverlappingWithElements(WebElement element, String readableName) {
351343 }
352344
353345 void validateMaxOffset (int top , int right , int bottom , int left ) {
346+ int rootElementRightOffset = getRightOffset (rootElement );
347+ int rootElementBottomOffset = getBottomOffset (rootElement );
354348 if (xRoot > left ) {
355349 putJsonDetailsWithoutElement (String .format ("Expected max left offset of element '%s' is: %spx. Actual left offset is: %spx" , rootElementReadableName , left , xRoot ));
356350 }
@@ -366,6 +360,8 @@ void validateMaxOffset(int top, int right, int bottom, int left) {
366360 }
367361
368362 void validateMinOffset (int top , int right , int bottom , int left ) {
363+ int rootElementRightOffset = getRightOffset (rootElement );
364+ int rootElementBottomOffset = getBottomOffset (rootElement );
369365 if (xRoot < left ) {
370366 putJsonDetailsWithoutElement (String .format ("Expected min left offset of element '%s' is: %spx. Actual left offset is: %spx" , rootElementReadableName , left , xRoot ));
371367 }
@@ -556,7 +552,7 @@ void validateLeftElement(WebElement leftElement) {
556552 }
557553 }
558554
559- boolean elementsAreOverlappedOnBorder (WebElement rootElement , WebElement elementOverlapWith ) {
555+ private boolean elementsAreOverlappedOnBorder (WebElement rootElement , WebElement elementOverlapWith ) {
560556 Point elLoc = elementOverlapWith .getLocation ();
561557 Dimension elSize = elementOverlapWith .getSize ();
562558 int xRoot = rootElement .getLocation ().x ;
@@ -577,7 +573,7 @@ boolean elementsAreOverlappedOnBorder(WebElement rootElement, WebElement element
577573 return sqCommon - sqElement >= sqRootElement ;
578574 }
579575
580- boolean elementsAreOverlapped (WebElement elementOverlapWith ) {
576+ private boolean elementsAreOverlapped (WebElement elementOverlapWith ) {
581577 Point elLoc = elementOverlapWith .getLocation ();
582578 Dimension elSize = elementOverlapWith .getSize ();
583579 return ((xRoot >= elLoc .x && yRoot > elLoc .y && xRoot < elLoc .x + elSize .width && yRoot < elLoc .y + elSize .height )
@@ -593,7 +589,7 @@ boolean elementsAreOverlapped(WebElement elementOverlapWith) {
593589 || elementsAreOverlappedOnBorder (rootElement , elementOverlapWith );
594590 }
595591
596- boolean elementsAreOverlapped (WebElement rootElement , WebElement elementOverlapWith ) {
592+ private boolean elementsAreOverlapped (WebElement rootElement , WebElement elementOverlapWith ) {
597593 Point elLoc = elementOverlapWith .getLocation ();
598594 Dimension elSize = elementOverlapWith .getSize ();
599595 int xRoot = rootElement .getLocation ().x ;
@@ -614,7 +610,7 @@ boolean elementsAreOverlapped(WebElement rootElement, WebElement elementOverlapW
614610 || elementsAreOverlappedOnBorder (rootElement , elementOverlapWith );
615611 }
616612
617- boolean elementsHaveEqualLeftRightOffset (boolean isLeft , WebElement elementToCompare ) {
613+ private boolean elementsHaveEqualLeftRightOffset (boolean isLeft , WebElement elementToCompare ) {
618614 Point elLoc = elementToCompare .getLocation ();
619615 Dimension elSize = elementToCompare .getSize ();
620616
@@ -625,7 +621,7 @@ boolean elementsHaveEqualLeftRightOffset(boolean isLeft, WebElement elementToCom
625621 }
626622 }
627623
628- boolean elementsHaveEqualLeftRightOffset (boolean isLeft , WebElement element , WebElement elementToCompare ) {
624+ private boolean elementsHaveEqualLeftRightOffset (boolean isLeft , WebElement element , WebElement elementToCompare ) {
629625 Point elLoc = elementToCompare .getLocation ();
630626 Dimension elSize = elementToCompare .getSize ();
631627 int xRoot = element .getLocation ().x ;
@@ -639,7 +635,7 @@ boolean elementsHaveEqualLeftRightOffset(boolean isLeft, WebElement element, Web
639635 }
640636
641637
642- boolean elementsHaveEqualTopBottomOffset (boolean isTop , WebElement elementToCompare ) {
638+ private boolean elementsHaveEqualTopBottomOffset (boolean isTop , WebElement elementToCompare ) {
643639 Point elLoc = elementToCompare .getLocation ();
644640 Dimension elSize = elementToCompare .getSize ();
645641
@@ -650,7 +646,7 @@ boolean elementsHaveEqualTopBottomOffset(boolean isTop, WebElement elementToComp
650646 }
651647 }
652648
653- boolean elementsHaveEqualTopBottomOffset (boolean isTop , WebElement element , WebElement elementToCompare ) {
649+ private boolean elementsHaveEqualTopBottomOffset (boolean isTop , WebElement element , WebElement elementToCompare ) {
654650 Point elLoc = elementToCompare .getLocation ();
655651 Dimension elSize = elementToCompare .getSize ();
656652 int yRoot = element .getLocation ().y ;
@@ -663,83 +659,62 @@ boolean elementsHaveEqualTopBottomOffset(boolean isTop, WebElement element, WebE
663659 }
664660 }
665661
666- void validateEqualLeftRightOffset (WebElement element , String rootElementReadableName ){
667- if (!elementHasEqualLeftRightOffset (element )){
662+ void validateEqualLeftRightOffset (WebElement element , String rootElementReadableName ) {
663+ if (!elementHasEqualLeftRightOffset (element )) {
668664 putJsonDetailsWithElement (String .format ("Element '%s' has not equal left and right offset. Left offset is %dpx, right is %dpx" , rootElementReadableName , getLeftOffset (element ), getRightOffset (element )), element );
669665 }
670666 }
671667
672- void validateEqualTopBottomOffset (WebElement element , String rootElementReadableName ){
673- if (!elementHasEqualTopBottomOffset (element )){
668+ void validateEqualTopBottomOffset (WebElement element , String rootElementReadableName ) {
669+ if (!elementHasEqualTopBottomOffset (element )) {
674670 putJsonDetailsWithElement (String .format ("Element '%s' has not equal top and bottom offset. Top offset is %dpx, bottom is %dpx" , rootElementReadableName , getTopOffset (element ), getBottomOffset (element )), element );
675671 }
676672 }
677673
678- void validateEqualLeftRightOffset (List <WebElement > elements ){
679- for (WebElement element : elements ) {
674+ void validateEqualLeftRightOffset (List <WebElement > elements ) {
675+ for (WebElement element : elements ) {
680676 if (!elementHasEqualLeftRightOffset (element )) {
681677 putJsonDetailsWithElement (String .format ("Element '%s' has not equal left and right offset. Left offset is %dpx, right is %dpx" , getFormattedMessage (element ), getLeftOffset (element ), getRightOffset (element )), element );
682678 }
683679 }
684680 }
685681
686- void validateEqualTopBottomOffset (List <WebElement > elements ){
687- for (WebElement element : elements ) {
682+ void validateEqualTopBottomOffset (List <WebElement > elements ) {
683+ for (WebElement element : elements ) {
688684 if (!elementHasEqualTopBottomOffset (element )) {
689685 putJsonDetailsWithElement (String .format ("Element '%s' has not equal top and bottom offset. Top offset is %dpx, bottom is %dpx" , getFormattedMessage (element ), getTopOffset (element ), getBottomOffset (element )), element );
690686 }
691687 }
692688 }
693689
694- boolean elementHasEqualLeftRightOffset (WebElement element ) {
690+ private boolean elementHasEqualLeftRightOffset (WebElement element ) {
695691 return getLeftOffset (element ) == getRightOffset (element );
696692 }
697693
698- boolean elementHasEqualTopBottomOffset (WebElement element ) {
694+ private boolean elementHasEqualTopBottomOffset (WebElement element ) {
699695 return getTopOffset (element ) == getBottomOffset (element );
700696 }
701697
702698 void drawRoot (Color color ) {
703699 g .setColor (color );
704700 g .setStroke (new BasicStroke (2 ));
705- if (isRetinaDisplay () && isChrome ()) {
706- g .drawRect (2 * xRoot , 2 * yRoot , 2 * widthRoot , 2 * heightRoot );
707- //g.fillRect(2 * xRoot, 2 * yRoot, 2 * widthRoot, 2 * heightRoot);
708- } else {
709- g .drawRect (xRoot , yRoot , widthRoot , heightRoot );
710- //g.fillRect(xRoot, yRoot, widthRoot, heightRoot);
711- }
701+ g .drawRect (getRetinaValue (xRoot ), getRetinaValue (yRoot ), getRetinaValue (widthRoot ), getRetinaValue (heightRoot ));
702+ //g.fillRect(getRetinaValue(xRoot), getRetinaValue((yRoot), getRetinaValue(widthRoot), getRetinaValue(heightRoot));
712703
713704 Stroke dashed = new BasicStroke (1 , BasicStroke .CAP_BUTT , BasicStroke .JOIN_BEVEL , 0 , new float []{9 }, 0 );
714705 g .setStroke (dashed );
715706 g .setColor (linesColor );
716707 if (drawLeftOffsetLine ) {
717- if (isRetinaDisplay () && isChrome ()) {
718- g .drawLine (2 * xRoot , 0 , 2 * xRoot , 2 * img .getHeight ());
719- } else {
720- g .drawLine (xRoot , 0 , xRoot , img .getHeight ());
721- }
708+ g .drawLine (getRetinaValue (xRoot ), 0 , getRetinaValue (xRoot ), getRetinaValue (img .getHeight ()));
722709 }
723710 if (drawRightOffsetLine ) {
724- if (isRetinaDisplay () && isChrome ()) {
725- g .drawLine (2 * (xRoot + widthRoot ), 0 , 2 * (xRoot + widthRoot ), 2 * img .getHeight ());
726- } else {
727- g .drawLine (xRoot + widthRoot , 0 , xRoot + widthRoot , img .getHeight ());
728- }
711+ g .drawLine (getRetinaValue (xRoot + widthRoot ), 0 , getRetinaValue (xRoot + widthRoot ), getRetinaValue (img .getHeight ()));
729712 }
730713 if (drawTopOffsetLine ) {
731- if (isRetinaDisplay () && isChrome ()) {
732- g .drawLine (0 , 2 * yRoot , 2 * img .getWidth (), 2 * yRoot );
733- } else {
734- g .drawLine (0 , yRoot , img .getWidth (), yRoot );
735- }
714+ g .drawLine (0 , getRetinaValue (yRoot ), getRetinaValue (img .getWidth ()), getRetinaValue (yRoot ));
736715 }
737716 if (drawBottomOffsetLine ) {
738- if (isRetinaDisplay () && isChrome ()) {
739- g .drawLine (0 , 2 * (yRoot + heightRoot ), 2 * img .getWidth (), 2 * (yRoot + heightRoot ));
740- } else {
741- g .drawLine (0 , yRoot + heightRoot , img .getWidth (), yRoot + heightRoot );
742- }
717+ g .drawLine (0 , getRetinaValue (yRoot + heightRoot ), getRetinaValue (img .getWidth ()), getRetinaValue (yRoot + heightRoot ));
743718 }
744719 }
745720
@@ -751,7 +726,7 @@ void putJsonDetailsWithoutElement(String message) {
751726 errorMessage .add (details );
752727 }
753728
754- void putJsonDetailsWithElement (String message , WebElement element ) {
729+ private void putJsonDetailsWithElement (String message , WebElement element ) {
755730 float xContainer = element .getLocation ().getX ();
756731 float yContainer = element .getLocation ().getY ();
757732 float widthContainer = element .getSize ().getWidth ();
@@ -794,6 +769,14 @@ String getFormattedMessage(WebElement element) {
794769 String .valueOf (element .getSize ().height ));
795770 }
796771
772+ int getRetinaValue (int value ) {
773+ if (isRetinaDisplay () && isChrome ()) {
774+ return 2 * value ;
775+ } else {
776+ return value ;
777+ }
778+ }
779+
797780 int getLeftOffset (WebElement element ) {
798781 return element .getLocation ().x ;
799782 }
@@ -810,6 +793,24 @@ int getBottomOffset(WebElement element) {
810793 return pageHeight - (element .getLocation ().y + element .getSize ().height );
811794 }
812795
796+ long getPageWidth () {
797+ if (!isMobile ()) {
798+ JavascriptExecutor executor = (JavascriptExecutor ) driver ;
799+ return (long ) executor .executeScript ("if (self.innerWidth) {return self.innerWidth;} if (document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}if (document.body) {return document.body.clientWidth;}" );
800+ } else {
801+ return driver .manage ().window ().getSize ().width ;
802+ }
803+ }
804+
805+ long getPageHeight () {
806+ if (!isMobile ()) {
807+ JavascriptExecutor executor = (JavascriptExecutor ) driver ;
808+ return (long ) executor .executeScript ("if (self.innerHeight) {return self.innerHeight;} if (document.documentElement && document.documentElement.clientHeight) {return document.documentElement.clientHeight;}if (document.body) {return document.body.clientHeight;}" );
809+ } else {
810+ return driver .manage ().window ().getSize ().height ;
811+ }
812+ }
813+
813814 public enum Units {
814815 PX ,
815816 PERCENT
0 commit comments