Skip to content

Commit c3cb77d

Browse files
authored
[INT-251] Support ignore regions for local snapshots (#230)
1 parent 4e20c2b commit c3cb77d

File tree

2 files changed

+75
-9
lines changed

2 files changed

+75
-9
lines changed

visual-java/src/main/java/com/saucelabs/visual/VisualApi.java

+56-9
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@
66
import com.saucelabs.visual.exception.VisualApiException;
77
import com.saucelabs.visual.graphql.*;
88
import com.saucelabs.visual.graphql.type.*;
9+
import com.saucelabs.visual.model.*;
910
import com.saucelabs.visual.model.DiffingMethodSensitivity;
10-
import com.saucelabs.visual.model.DiffingMethodTolerance;
11-
import com.saucelabs.visual.model.FullPageScreenshotConfig;
12-
import com.saucelabs.visual.model.IgnoreRegion;
13-
import com.saucelabs.visual.model.VisualRegion;
1411
import com.saucelabs.visual.utils.CapabilityUtils;
1512
import com.saucelabs.visual.utils.ConsoleColors;
1613
import com.saucelabs.visual.utils.EnvironmentVariables;
@@ -24,10 +21,7 @@
2421
import java.util.regex.Pattern;
2522
import java.util.stream.Collectors;
2623
import org.apache.http.client.config.RequestConfig;
27-
import org.openqa.selenium.By;
28-
import org.openqa.selenium.Capabilities;
29-
import org.openqa.selenium.OutputType;
30-
import org.openqa.selenium.WebElement;
24+
import org.openqa.selenium.*;
3125
import org.openqa.selenium.remote.*;
3226
import org.slf4j.Logger;
3327
import org.slf4j.LoggerFactory;
@@ -622,6 +616,27 @@ private void sauceVisualCheckLocal(String snapshotName, CheckOptions options) {
622616
// upload image
623617
this.client.upload(uploadResult.getImageUploadUrl(), screenshot, "image/png");
624618

619+
// add ignore regions
620+
WindowScroll scroll = getWindowScroll();
621+
List<RegionIn> ignoreRegions = extractIgnoreList(options);
622+
623+
for (WebElement element : options.getIgnoreElements()) {
624+
RegionIn ignoreRegion = VisualRegion.ignoreChangesFor(element).toRegionIn();
625+
ignoreRegions.add(ignoreRegion);
626+
}
627+
628+
for (IgnoreSelectorIn selector : options.getIgnoreSelectors()) {
629+
VisualRegion region = getIgnoreRegionFromSelector(selector);
630+
if (region != null) {
631+
ignoreRegions.add(region.toRegionIn());
632+
}
633+
}
634+
635+
for (RegionIn region : ignoreRegions) {
636+
region.setX(region.getX() - scroll.getX());
637+
region.setY(region.getY() - scroll.getY());
638+
}
639+
625640
// upload dom if present / enabled
626641
Boolean shouldCaptureDom = Optional.ofNullable(options.getCaptureDom()).orElse(this.captureDom);
627642
if (shouldCaptureDom != null && shouldCaptureDom) {
@@ -657,7 +672,7 @@ private void sauceVisualCheckLocal(String snapshotName, CheckOptions options) {
657672
.withSuiteName(getOrInferSuiteName(options))
658673
.withDiffingMethod(toDiffingMethod(options))
659674
.withDiffingOptions(options.getDiffingOptions())
660-
.withIgnoreRegions(extractIgnoreList(options))
675+
.withIgnoreRegions(ignoreRegions)
661676
.withDiffingMethodSensitivity(
662677
Optional.ofNullable(getDiffingMethodSensitivity(options))
663678
.map(DiffingMethodSensitivity::asGraphQLType)
@@ -714,6 +729,38 @@ private DiffingMethodTolerance getDiffingMethodTolerance(CheckOptions checkOptio
714729
return sensitivity != null ? sensitivity : this.diffingMethodTolerance;
715730
}
716731

732+
private WindowScroll getWindowScroll() {
733+
Object result = driver.executeScript("return [window.scrollX, window.scrollY]");
734+
if (!(result instanceof List<?>)) {
735+
return new WindowScroll(0, 0);
736+
}
737+
738+
List<?> list = (List<?>) result;
739+
Object rawScrollX = list.get(0);
740+
Object rawScrollY = list.get(1);
741+
742+
int scrollX = rawScrollX instanceof Long ? ((Long) rawScrollX).intValue() : 0;
743+
int scrollY = rawScrollY instanceof Long ? ((Long) rawScrollY).intValue() : 0;
744+
745+
return new WindowScroll(scrollX, scrollY);
746+
}
747+
748+
private VisualRegion getIgnoreRegionFromSelector(IgnoreSelectorIn ignoreSelector) {
749+
SelectorIn selector = ignoreSelector.getSelector();
750+
By bySelector;
751+
752+
switch (selector.getType()) {
753+
case XPATH:
754+
bySelector = By.xpath(selector.getValue());
755+
break;
756+
default:
757+
return null;
758+
}
759+
760+
WebElement element = driver.findElement(bySelector);
761+
return new VisualRegion(element, ignoreSelector.getDiffingOptions());
762+
}
763+
717764
private static DiffingMethod toDiffingMethod(CheckOptions options) {
718765
if (options == null || options.getDiffingMethod() == null) {
719766
return DiffingMethod.BALANCED;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.saucelabs.visual.model;
2+
3+
public class WindowScroll {
4+
private final int x;
5+
private final int y;
6+
7+
public WindowScroll(int x, int y) {
8+
this.x = x;
9+
this.y = y;
10+
}
11+
12+
public int getX() {
13+
return x;
14+
}
15+
16+
public int getY() {
17+
return y;
18+
}
19+
}

0 commit comments

Comments
 (0)