View Javadoc

1   package com.atlassian.webdriver.it.visualcomparison;
2   
3   import com.atlassian.selenium.visualcomparison.VisualComparer;
4   import com.atlassian.selenium.visualcomparison.utils.BoundingBox;
5   import com.atlassian.selenium.visualcomparison.utils.ScreenResolution;
6   import com.atlassian.selenium.visualcomparison.v2.Comparer;
7   import com.atlassian.selenium.visualcomparison.v2.DefaultComparer;
8   import com.atlassian.selenium.visualcomparison.v2.VisualComparisonFailedException;
9   import com.atlassian.selenium.visualcomparison.v2.settings.Resolution;
10  import com.atlassian.webdriver.AtlassianWebDriver;
11  import com.atlassian.webdriver.debug.WebDriverDebug;
12  import com.atlassian.webdriver.it.AbstractSimpleServerTest;
13  import com.atlassian.webdriver.it.pageobjects.page.VisualComparisonPage;
14  import com.atlassian.webdriver.rule.test.TemporaryFolderPreservingOnFailure;
15  import com.atlassian.webdriver.testing.annotation.WindowSize;
16  import com.atlassian.webdriver.visualcomparison.VisualComparisonSupport;
17  import com.atlassian.webdriver.visualcomparison.WebDriverBrowserEngine;
18  import com.atlassian.webdriver.visualcomparison.WebDriverVisualComparableClient;
19  import junit.framework.AssertionFailedError;
20  import org.apache.commons.io.IOUtils;
21  import org.junit.Before;
22  import org.junit.Rule;
23  import org.junit.Test;
24  import org.openqa.selenium.By;
25  import org.openqa.selenium.Dimension;
26  import org.openqa.selenium.Point;
27  import org.openqa.selenium.WebElement;
28  
29  import javax.inject.Inject;
30  import java.io.*;
31  import java.util.ArrayList;
32  import java.util.List;
33  
34  import static com.atlassian.selenium.visualcomparison.v2.ComparisonSettings.emptySettings;
35  import static com.atlassian.selenium.visualcomparison.v2.settings.Resolution.R1024_768;
36  import static org.apache.commons.io.FileUtils.readFileToString;
37  import static org.junit.Assert.*;
38  
39  @WindowSize(width = 1024, height = 768)
40  public class TestComparerV2ApiCompatibility extends AbstractSimpleServerTest
41  {
42      private static final String RESOLUTION_STRING = R1024_768.toString();
43  
44      private static final String TEST_1_ID = "test-1";
45      private static final String BASELINE_1_NAME = TEST_1_ID + "." + RESOLUTION_STRING + ".png";
46      private static final String REPORT_1_FILE_NAME = "report-" + TEST_1_ID + "-" + RESOLUTION_STRING + ".html";
47  
48      private static final String TEST_2_ID = "test-2";
49      private static final String BASELINE_2_NAME = TEST_2_ID + "." + RESOLUTION_STRING + ".png";
50      private static final String REPORT_2_FILE_NAME = "report-" + TEST_2_ID + "-" + RESOLUTION_STRING + ".html";
51  
52      private static final String[] BASELINES = { BASELINE_2_NAME };
53  
54      @Inject
55      private AtlassianWebDriver webDriver;
56  
57      @Inject
58      private VisualComparisonSupport comparisonSupport;
59  
60      @Inject
61      private WebDriverDebug webDriverDebug;
62  
63      @Rule
64      public final TemporaryFolderPreservingOnFailure testFolder =
65              new TemporaryFolderPreservingOnFailure(new File("target/visualcomparisontests"));
66  
67      private File baselineDir;
68      private File v1reportDir;
69      private File v2reportDir;
70  
71      @Before
72      public void setUpDirs() throws IOException
73      {
74          baselineDir = testFolder.getFolder().newFolder("baseline");
75          v1reportDir = testFolder.getFolder().newFolder("reports-v1");
76          v2reportDir = testFolder.getFolder().newFolder("reports-v2");
77          copyBaselines();
78      }
79  
80      private void copyBaselines() throws IOException
81      {
82          for (String baseline : BASELINES)
83          {
84              copyBaseline(baseline);
85          }
86      }
87  
88      private void copyBaseline(String baselineName) throws IOException
89      {
90          InputStream baseline = null;
91          OutputStream baselineFile = null;
92          try
93          {
94              baseline = getClass().getResourceAsStream("/visualcomparison/" + baselineName);
95              baselineFile = new FileOutputStream(new File(baselineDir, baselineName));
96              IOUtils.copy(baseline, baselineFile);
97          }
98          finally
99          {
100             IOUtils.closeQuietly(baseline);
101             IOUtils.closeQuietly(baselineFile);
102         }
103     }
104 
105     @Test
106     public void testCompatibilitySuccessfulCompare() throws IOException
107     {
108 
109         product.visit(VisualComparisonPage.class, 1);
110         VisualComparer legacyComparer = getLegacyComparer();
111         addIgnoredElementOldStyle(legacyComparer, By.className("aui-header-logo-device"));
112         webDriverDebug.takeScreenshotTo(new File(baselineDir, BASELINE_1_NAME));
113 
114         legacyComparer.assertUIMatches(TEST_1_ID, baselineDir.getAbsolutePath());
115 
116         Comparer newComparer = new DefaultComparer(new WebDriverBrowserEngine(webDriver), emptySettings()
117                 .withResolution(Resolution.R1024_768)
118                 .withBaselineDirectory(baselineDir)
119                 .withReportingEnabled(v2reportDir)
120                 .ignoringSingleLineDifferences(true));
121 
122         newComparer.compare("test-1", emptySettings()
123                 .ignoringPart(comparisonSupport.asPagePart(By.className("aui-header-logo-device"))));
124 
125         assertFalse("Report HTML for V1 should not exist", new File(v1reportDir, REPORT_1_FILE_NAME).exists());
126         assertFalse("Report HTML for V2 should not exist", new File(v2reportDir, REPORT_1_FILE_NAME).exists());
127     }
128 
129     @Test
130     public void testCompatibilityFailedCompare() throws IOException
131     {
132         VisualComparer legacyComparer = getLegacyComparer();
133         product.visit(VisualComparisonPage.class, 2);
134 
135         try
136         {
137             legacyComparer.assertUIMatches(TEST_2_ID, baselineDir.getAbsolutePath());
138             fail("Legacy comparer should throw exception on comparison failure");
139         }
140         catch (AssertionFailedError expected)
141         {
142         }
143 
144         Comparer newComparer = new DefaultComparer(new WebDriverBrowserEngine(webDriver), emptySettings()
145                 .withResolution(Resolution.R1024_768)
146                 .withBaselineDirectory(baselineDir)
147                 .withReportingEnabled(v2reportDir)
148                 .ignoringSingleLineDifferences(true));
149 
150         try
151         {
152             newComparer.compare(TEST_2_ID);
153             fail("New comparer should throw exception on comparison failure");
154         }
155         catch (VisualComparisonFailedException expected)
156         {
157         }
158 
159         assertEquals(readFileToString(new File(v1reportDir, REPORT_2_FILE_NAME)),
160                 readFileToString(new File(v2reportDir, REPORT_2_FILE_NAME)));
161     }
162 
163     @Test(expected = VisualComparisonFailedException.class)
164     public void testBaselineMissing()
165     {
166         Comparer comparer = new DefaultComparer(new WebDriverBrowserEngine(webDriver), emptySettings()
167                 .withResolution(Resolution.R1024_768)
168                 .withBaselineDirectory(baselineDir)
169                 .withReportingEnabled(v2reportDir)
170                 .ignoringSingleLineDifferences(true));
171 
172         product.visit(VisualComparisonPage.class, 1);
173         comparer.compare("test-3"); // baseline doesn't exist, should error out
174     }
175 
176     private VisualComparer getLegacyComparer()
177     {
178         VisualComparer oldComparer = new VisualComparer(new WebDriverVisualComparableClient(webDriver));
179         oldComparer.setScreenResolutions(new ScreenResolution[] {
180                 new ScreenResolution(1024, 768)
181         });
182         oldComparer.setWaitforJQueryTimeout(2000);
183         oldComparer.setIgnoreSingleLineDiffs(true);
184         oldComparer.enableReportGeneration(v1reportDir.getAbsolutePath());
185         return oldComparer;
186     }
187 
188     private void addIgnoredElementOldStyle(VisualComparer oldComparer, By selector)
189     {
190         WebElement elementBySelector = webDriver.findElement(selector);
191         Dimension size = elementBySelector.getSize();
192         Point location = elementBySelector.getLocation();
193         BoundingBox elementArea = new BoundingBox(location.x, location.y, location.x + size.getWidth(),
194                 location.y + size.getHeight());
195 
196         List<BoundingBox> ignoreAreas = oldComparer.getIgnoreAreas();
197         ignoreAreas = (null == ignoreAreas) ? new ArrayList<BoundingBox>() : new ArrayList<BoundingBox>(ignoreAreas);
198         ignoreAreas.add(elementArea);
199         oldComparer.setIgnoreAreas(ignoreAreas);
200     }
201 }