diff --git a/README.md b/README.md index 574d0e5b..6e92e1d8 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,27 @@ Html Elements framework ======================= -[![release](http://github-release-version.herokuapp.com/github/yandex-qatools/htmlelements/release.svg?style=flat)](https://github.com/yandex-qatools/htmlelements/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/ru.yandex.qatools.htmlelements/htmlelements-java/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/ru.yandex.qatools.htmlelements/htmlelements-java) +[![release](http://github-release-version.herokuapp.com/github/yandex-qatools/htmlelements/release.svg?style=flat)] +(https://github.com/yandex-qatools/htmlelements/releases/latest) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/ru.yandex.qatools.htmlelements/htmlelements-java/badge.svg?style=flat)] +(https://maven-badges.herokuapp.com/maven-central/ru.yandex.qatools.htmlelements/htmlelements-java) - -This framework is designed to provide an easy-to-use way of interacting with web-page elements in your tests. It can be -considered to be an extension of WebDriver Page Object. +This framework is designed to provide an easy-to-use way of interacting with web-page elements in your tests. +It can be considered to be an extension of WebDriver Page Object. With the help of the Html Elements framework you can group web-page elements into blocks, encapsulate logic of interaction within them and then easily use created blocks in page objects. It also provides a set of helpful matchers to use with web-page elements -and blocks. See [JavaDocs](https://oss.sonatype.org/service/local/repositories/releases/archive/ru/yandex/qatools/htmlelements/htmlelements-java/1.12/htmlelements-java-1.12-javadoc.jar/!/index.html) +and blocks. See [JavaDocs] +(https://oss.sonatype.org/service/local/repositories/releases/archive/ru/yandex/qatools/htmlelements/htmlelements-java/1.16/htmlelements-java-1.16-javadoc.jar/!/index.html) and [Samples](https://github.com/yandex-qatools/htmlelements-examples) for more details. -You can ask your questions on StackOverflow with [![htmlelements](https://img.shields.io/badge/stackoverflow-htmlelements-orange.svg?style=flat)](http://stackoverflow.com/questions/tagged/htmlelements) tag. +You can ask your questions on StackOverflow with the [![htmlelements] +(https://img.shields.io/badge/stackoverflow-htmlelements-orange.svg?style=flat)] +(http://stackoverflow.com/questions/tagged/htmlelements) tag. Other Languages ------------- -In case you are non-java guy, don't panic, there are still few options: +In case you are not a Java guy/gal, don't panic, there are still few options: * [Html Elements .NET implementation](https://github.com/yandex-qatools/htmlelements-dotnet) - .NET port made by [Vadzim Hushchanskou](https://github.com/HardNorth) * [Html Elements PHP implementation](https://github.com/qa-tools/qa-tools) - PHP port made by [Alexander Obuhovich](https://github.com/aik099) @@ -24,6 +29,8 @@ In case you are non-java guy, don't panic, there are still few options: Release Notes ------------- +* [Version 1.17 Release Notes](https://github.com/yandex-qatools/htmlelements/releases/tag/htmlelements-1.17) +* [Version 1.16 Release Notes](https://github.com/yandex-qatools/htmlelements/releases/tag/htmlelements-1.16) * [Version 1.15 Release Notes](https://github.com/yandex-qatools/htmlelements/releases/tag/htmlelements-1.15) * [Version 1.14 Release Notes](https://github.com/yandex-qatools/htmlelements/releases/tag/htmlelements-1.14) * [Version 1.13 Release Notes](https://github.com/yandex-qatools/htmlelements/releases/tag/htmlelements-1.13) @@ -40,7 +47,7 @@ Maven dependencies for Html Elements core: ru.yandex.qatools.htmlelements htmlelements-java - 1.15 + 1.17 ``` @@ -50,7 +57,7 @@ And for Thucydides integration: ru.yandex.qatools.htmlelements htmlelements-thucydides - 1.15 + 1.17 ``` @@ -60,11 +67,11 @@ Or you can include all modules at once if needed: ru.yandex.qatools.htmlelements htmlelements-all - 1.15 + 1.17 ``` -Since 1.15 it requires Java 8. Please use 1.14 for Java 7 support. +Since 1.15 Java 8 is required. Please use 1.14 for Java 7 support. Create blocks of elements ------------------------- @@ -74,6 +81,7 @@ For example, let's create a block for the search form on the page http://www.yan @Name("Search form") @FindBy(xpath = "//form") public class SearchArrow extends HtmlElement { + @Name("Search request input") @FindBy(id = "searchInput") private TextInput requestInput; @@ -95,8 +103,9 @@ You can easily use created blocks in page objects: ```java public class SearchPage { + private SearchArrow searchArrow; - // Other blocks and elements here + // Other blocks and elements here ... public SearchPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); @@ -106,16 +115,17 @@ public class SearchPage { searchArrow.search(request); } - // Other methods here + // Other methods here ... } ``` Use page objects in your tests ------------------------------ -Created page objects can be used in your tests. This makes tests more concise and easy to write. +Created page objects can be used in your tests. This makes tests more concise, easier to maintain, and easy to write. ```java public class SampleTest { + private WebDriver driver = new FirefoxDriver(); private SearchPage searchPage = new SearchPage(driver); @@ -139,4 +149,5 @@ public class SampleTest { Questions? ---------- -In case you can't find an answer in documentation and examples provided above, you can ask it on StackOverflow with [![htmlelements](https://img.shields.io/badge/stackoverflow-htmlelements-orange.svg?style=flat)](http://stackoverflow.com/questions/tagged/htmlelements) tag. +In case you can't find an answer in documentation and examples provided above, you can ask it on StackOverflow with the +[![htmlelements](https://img.shields.io/badge/stackoverflow-htmlelements-orange.svg?style=flat)](http://stackoverflow.com/questions/tagged/htmlelements) tag. diff --git a/htmlelements-all/pom.xml b/htmlelements-all/pom.xml index 8d6b3ba5..0c49b27b 100644 --- a/htmlelements-all/pom.xml +++ b/htmlelements-all/pom.xml @@ -5,7 +5,7 @@ htmlelements ru.yandex.qatools.htmlelements - 1.16-SNAPSHOT + 1.18-SNAPSHOT htmlelements-all diff --git a/htmlelements-java/pom.xml b/htmlelements-java/pom.xml index c8b046a0..e87d7dce 100644 --- a/htmlelements-java/pom.xml +++ b/htmlelements-java/pom.xml @@ -5,7 +5,7 @@ ru.yandex.qatools.htmlelements htmlelements - 1.16-SNAPSHOT + 1.18-SNAPSHOT htmlelements-java @@ -23,27 +23,11 @@ selenium-java ${selenium.version} - - commons-lang - commons-lang - 2.6 - org.apache.commons commons-lang3 3.4 - - com.googlecode.lambdaj - lambdaj - 2.3.3 - - - org.hamcrest - hamcrest-all - - - junit junit diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Button.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Button.java index ad9896ce..1f548df5 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Button.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Button.java @@ -17,11 +17,4 @@ public class Button extends TypifiedElement { public Button(WebElement wrappedElement) { super(wrappedElement); } - - /** - * Clicks the button. - */ - public void click() { - getWrappedElement().click(); - } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/CheckBox.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/CheckBox.java index 2abdaa69..a08eacd0 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/CheckBox.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/CheckBox.java @@ -80,11 +80,4 @@ public void set(boolean value) { deselect(); } } - - /** - * Indicates whether checkbox is selected. - */ - public boolean isSelected() { - return getWrappedElement().isSelected(); - } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Form.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Form.java index f8dadbb7..a903d898 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Form.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Form.java @@ -3,12 +3,16 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebElement; +import java.util.AbstractMap; import java.util.List; import java.util.Map; import java.util.Objects; +import static java.util.Objects.isNull; + /** - * Represents web page form tag. Provides handy way of filling form with data and submitting it. + * Represents web page form tag. + * Provides handy way of filling form with data and submitting it. * * @author Artem Eroshenko eroshenkoam@yandex-team.ru * 3/14/13, 4:38 PM @@ -33,34 +37,28 @@ public Form(WebElement wrappedElement) { /** * Fills form with data contained in passed map. - * For each map entry an input with a name coincident with entry key is searched and then found input - * is filled with string representation of entry value (toString() method is called). If input with such a name - * is not found corresponding entry is skipped. + * For each map entry if an input with a name coincident with entry key exists + * it is filled with string representation of entry value. + * If an input with such a name is not found the corresponding entry is skipped. * * @param data Map containing data to fill form inputs with. */ public void fill(Map data) { - for (String key : data.keySet()) { - WebElement elementToFill = findElementByKey(key); - if (elementToFill != null) { - fillElement(elementToFill, Objects.toString(data.get(key), "")); - } - } - } - - /** - * Submits represented form. - */ - public void submit() { - getWrappedElement().submit(); + data.entrySet().stream() + .map(e -> new AbstractMap.SimpleEntry<>( + findElementByKey(e.getKey()), + Objects.toString(e.getValue(), ""))) + .filter(e -> !isNull(e.getKey())) + .forEach(e -> fillElement(e.getKey(), e.getValue())); } protected WebElement findElementByKey(String key) { List elements = getWrappedElement().findElements(By.name(key)); if (elements.isEmpty()) { return null; + } else { + return elements.get(0); } - return elements.get(0); } protected void fillElement(WebElement element, String value) { @@ -85,32 +83,28 @@ protected String getElementType(WebElement element) { String type = element.getAttribute("type"); if ("checkbox".equals(type)) { return CHECKBOX_FIELD; - } - if ("radio".equals(type)) { + } else if ("radio".equals(type)) { return RADIO_FIELD; - } - if ("file".equals(type)) { + } else if ("file".equals(type)) { return FILE_FIELD; + } else { + return INPUT_FIELD; } - return INPUT_FIELD; - } - if ("select".equals(tagName)) { + } else if ("select".equals(tagName)) { return SELECT_FIELD; - } - if ("textarea".equals(tagName)) { + } else if ("textarea".equals(tagName)) { return INPUT_FIELD; + } else { + return null; } - return null; } protected void fillCheckBox(WebElement element, String value) { - CheckBox checkBox = new CheckBox(element); - checkBox.set(Boolean.parseBoolean(value)); + new CheckBox(element).set(Boolean.parseBoolean(value)); } protected void fillRadio(WebElement element, String value) { - Radio radio = new Radio(element); - radio.selectByValue(value); + new Radio(element).selectByValue(value); } protected void fillInput(WebElement element, String value) { @@ -119,12 +113,10 @@ protected void fillInput(WebElement element, String value) { } protected void fillSelect(WebElement element, String value) { - Select select = new Select(element); - select.selectByValue(value); + new Select(element).selectByValue(value); } protected void fillFile(WebElement element, String value) { - FileInput fileInput = new FileInput(element); - fileInput.setFileToUpload(value); + new FileInput(element).setFileToUpload(value); } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Image.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Image.java index 56e57c60..b608c331 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Image.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Image.java @@ -31,11 +31,4 @@ public String getAlt() { return getWrappedElement().getAttribute("alt"); } - /** - * Click on image - */ - public void click() { - getWrappedElement().click(); - } - } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Link.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Link.java index bdcd1247..604afa6c 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Link.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Link.java @@ -20,18 +20,4 @@ public Link(WebElement wrappedElement) { public String getReference() { return getWrappedElement().getAttribute("href"); } - - /** - * Clicks the link. - */ - public void click() { - getWrappedElement().click(); - } - - /** - * Returns text of the link. - */ - public String getText() { - return getWrappedElement().getText(); - } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Radio.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Radio.java index 182ee7b7..c36326c6 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Radio.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Radio.java @@ -5,7 +5,6 @@ import org.openqa.selenium.WebElement; import java.util.List; -import java.util.Optional; /** * Represents a group of radio buttons. @@ -72,13 +71,13 @@ public boolean hasSelectedButton() { * @param value The value to match against. */ public void selectByValue(String value) { - Optional matchingButton = getButtons().stream() + WebElement matchingButton = getButtons().stream() .filter(b -> value.equals(b.getAttribute("value"))) - .findFirst(); - - selectButton(matchingButton + .findFirst() .orElseThrow(() -> new NoSuchElementException( - String.format("Cannot locate radio button with value: %s", value)))); + String.format("Cannot locate radio button with value: %s", value))); + + selectButton(matchingButton); } /** @@ -90,7 +89,8 @@ public void selectByIndex(int index) { List buttons = getButtons(); if (index < 0 || index >= buttons.size()) { - throw new NoSuchElementException(String.format("Cannot locate radio button with index: %d", index)); + throw new NoSuchElementException( + String.format("Cannot locate radio button with index: %d", index)); } selectButton(buttons.get(index)); diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Table.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Table.java index bd2836f6..b2193dec 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Table.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/Table.java @@ -29,7 +29,7 @@ public Table(WebElement wrappedElement) { /** * Returns a list of table heading elements ({@code }). - * + *

* Multiple rows of heading elements, ({@code }), are flattened * i.e. the second row, ({@code }), will follow the first, which can be * misleading when the table uses {@code colspan} and {@code rowspan}. @@ -111,7 +111,7 @@ public List> getColumns() { */ public List getColumnByIndex(int index) { return getWrappedElement().findElements( - By.cssSelector(String.format("tr > td:nth-of-type(%d)", index))); + By.cssSelector(String.format("tr > td:nth-of-type(%d)", index))); } /** @@ -142,7 +142,11 @@ public WebElement getCellAt(int i, int j) { * Returns list of maps where keys are table headings and values are table row elements ({@code }). */ public List> getRowsMappedToHeadings() { - return getRowsMappedToHeadings(getHeadingsAsString()); + List headingsAsString = getHeadingsAsString(); + return getRows().stream() + .map(row -> row.stream() + .collect(toMap(e -> headingsAsString.get(row.indexOf(e)), identity()))) + .collect(toList()); } /** @@ -151,10 +155,9 @@ public List> getRowsMappedToHeadings() { * @param headings List containing strings to be used as table headings. */ public List> getRowsMappedToHeadings(List headings) { - List> rows = getRows(); - return rows.stream() - .map(row -> row.stream() - .collect(toMap(e -> headings.get(row.indexOf(e)), identity()))) + return getRowsMappedToHeadings().stream() + .map(e -> e.entrySet().stream().filter(m -> headings.contains(m.getKey())) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue))) .collect(toList()); } @@ -162,7 +165,11 @@ public List> getRowsMappedToHeadings(List headin * Same as {@link #getRowsMappedToHeadings()} but retrieves text from row elements ({@code }). */ public List> getRowsAsStringMappedToHeadings() { - return getRowsAsStringMappedToHeadings(getHeadingsAsString()); + return getRowsMappedToHeadings().stream() + .map(m -> m.entrySet().stream() + .collect(toMap(Map.Entry::getKey, e -> e.getValue().getText()))) + .collect(toList()); + } /** diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextBlock.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextBlock.java index 4d3e2400..64c8a15d 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextBlock.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextBlock.java @@ -11,11 +11,4 @@ public class TextBlock extends TypifiedElement { public TextBlock(WebElement wrappedElement) { super(wrappedElement); } - - /** - * Returns text contained in text block. - */ - public String getText() { - return getWrappedElement().getText(); - } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextInput.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextInput.java index a8f4cb8f..dc60eb9a 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextInput.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TextInput.java @@ -22,22 +22,6 @@ public TextInput(WebElement wrappedElement) { super(wrappedElement); } - /** - * Clears all the text entered into this text input. - */ - public void clear() { - getWrappedElement().clear(); - } - - /** - * Prints specified char sequence into this text input. - * - * @param keys Text to print. - */ - public void sendKeys(CharSequence... keys) { - getWrappedElement().sendKeys(keys); - } - /** * @return Text entered into the text input. * @deprecated Use getText() instead. @@ -54,12 +38,13 @@ public String getEnteredText() { * * @return Text entered into the text input. */ + @Override public String getText() { if ("textarea".equals(getWrappedElement().getTagName())) { return getWrappedElement().getText(); } - return Optional.of(getWrappedElement().getAttribute("value")).orElse(""); + return Optional.ofNullable(getWrappedElement().getAttribute("value")).orElse(""); } /** diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TypifiedElement.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TypifiedElement.java index 98527fef..26a9e707 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TypifiedElement.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/element/TypifiedElement.java @@ -1,26 +1,39 @@ package ru.yandex.qatools.htmlelements.element; +import org.openqa.selenium.By; +import org.openqa.selenium.Dimension; import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.internal.WrapsElement; +import java.util.List; + /** * The base class to be used for making classes representing typified elements (i.e web page controls such as * text inputs, buttons or more complex elements). *

* There are several already written classes representing standard web page controls: *

    + *
  • {@link Table}
  • *
  • {@link TextInput}
  • - *
  • {@link Button}
  • *
  • {@link CheckBox}
  • - *
  • {@link Radio}
  • *
  • {@link Select}
  • + *
  • {@link Link}
  • + *
  • {@link Button}
  • + *
  • {@link Radio}
  • + *
  • {@link TextBlock}
  • + *
  • {@link Image}
  • + *
  • {@link Form}
  • + *
  • {@link FileInput}
  • *
*

- * But you can also write your own typified elements if it's needed. For example, like this: + * But you can also write your own typified elements if needed. For example: *

- *

- * public class Link extends TypifiedElement {
+ * 
+ * public class Link extends TypifiedElement {
  * public Link(WebElement wrappedElement) {
  * super(wrappedElement);
  * }
@@ -28,21 +41,14 @@
  * public String getReference() {
  * return getWrappedElement().getAttribute("href");
  * }
- * 

- * public void click() { - * getWrappedElement().click(); - * } - *

- * public String getText() { - * return getWrappedElement().getText(); - * } * } + * *

* * @author Alexander Tolmachev starlight@yandex-team.ru * Date: 13.08.12 */ -public abstract class TypifiedElement implements WrapsElement, Named { +public abstract class TypifiedElement implements WrapsElement, Named, WebElement { private final WebElement wrappedElement; private String name; @@ -55,11 +61,6 @@ protected TypifiedElement(WebElement wrappedElement) { this.wrappedElement = wrappedElement; } - @Override - public WebElement getWrappedElement() { - return wrappedElement; - } - @Override public String getName() { return name; @@ -90,7 +91,8 @@ public String toString() { * * @return True if the element exists on page, false otherwise. */ - @SuppressWarnings("squid:S1166") // Sonar "Exception handlers should preserve the original exception" rule + @SuppressWarnings("squid:S1166") + // Sonar "Exception handlers should preserve the original exception" rule public boolean exists() { try { getWrappedElement().isDisplayed(); @@ -100,33 +102,93 @@ public boolean exists() { return true; } - /** - * Is this element displayed or not? This method avoids the problem of having to parse an - * element's "style" attribute. - * - * @return Whether or not the element is displayed - */ - public boolean isDisplayed() { - return getWrappedElement().isDisplayed(); + @Override + public WebElement getWrappedElement() { + return wrappedElement; } - /** - * Is the element currently enabled or not? This will generally return true for everything but - * disabled input elements. - * - * @return True if the element is enabled, false otherwise. - */ - public boolean isEnabled() { - return getWrappedElement().isEnabled(); + @Override + public void click() { + getWrappedElement().click(); } - /** - * Determine whether or not this element is selected or not. This operation only applies to input - * elements such as checkboxes, options in a select and radio buttons. - * - * @return True if the element is currently selected or checked, false otherwise. - */ + @Override + public void submit() { + getWrappedElement().submit(); + } + + @Override + public void sendKeys(CharSequence... keysToSend) { + getWrappedElement().sendKeys(keysToSend); + } + + @Override + public void clear() { + getWrappedElement().clear(); + } + + @Override + public String getTagName() { + return getWrappedElement().getTagName(); + } + + @Override + public String getAttribute(String name) { + return getWrappedElement().getAttribute(name); + } + + @Override public boolean isSelected() { return getWrappedElement().isSelected(); } + + @Override + public boolean isEnabled() { + return getWrappedElement().isEnabled(); + } + + @Override + public String getText() { + return getWrappedElement().getText(); + } + + @Override + public List findElements(By by) { + return getWrappedElement().findElements(by); + } + + @Override + public WebElement findElement(By by) { + return getWrappedElement().findElement(by); + } + + @Override + public boolean isDisplayed() { + return getWrappedElement().isDisplayed(); + } + + @Override + public Point getLocation() { + return getWrappedElement().getLocation(); + } + + @Override + public Dimension getSize() { + return getWrappedElement().getSize(); + } + + @Override + public Rectangle getRect() { + return getWrappedElement().getRect(); + } + + @Override + public String getCssValue(String propertyName) { + return getWrappedElement().getCssValue(propertyName); + } + + @Override + public X getScreenshotAs(OutputType target) { + return getWrappedElement().getScreenshotAs(target); + } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/HtmlElementLoader.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/HtmlElementLoader.java index 2d12eb76..7521db73 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/HtmlElementLoader.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/HtmlElementLoader.java @@ -100,15 +100,25 @@ public static T createHtmlElement(Class clazz, Search public static T createHtmlElement(Class elementClass, WebElement elementToWrap, String name) { - try { - T instance = newInstance(elementClass); + return createHtmlElement(null, elementClass, elementToWrap, name); + } + + public static + T createHtmlElement(Object outerObject, Class elementClass, + WebElement elementToWrap, String name){ + try{ + T instance; + if (outerObject == null) + instance = newInstance(elementClass); + else + instance = newInstance(outerObject, elementClass); instance.setWrappedElement(elementToWrap); instance.setName(name); // Recursively initialize elements of the block populatePageObject(instance, elementToWrap); return instance; } catch (NoSuchMethodException | InstantiationException | IllegalAccessException - | InvocationTargetException e) { + | InvocationTargetException e){ throw new HtmlElementsException(e); } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/HtmlElementDecorator.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/HtmlElementDecorator.java index 3d44bbc5..f3f1f7e7 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/HtmlElementDecorator.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/HtmlElementDecorator.java @@ -50,26 +50,40 @@ public HtmlElementDecorator(CustomElementLocatorFactory factory) { } public Object decorate(ClassLoader loader, Field field) { - if (isTypifiedElement(field)) { - return decorateTypifiedElement(loader, field); - } - if (isHtmlElement(field)) { - return decorateHtmlElement(loader, field); - } - if (isWebElement(field) && !field.getName().equals("wrappedElement")) { - return decorateWebElement(loader, field); - } - if (isTypifiedElementList(field)) { - return decorateTypifiedElementList(loader, field); - } - if (isHtmlElementList(field)) { - return decorateHtmlElementList(loader, field); - } - if (isWebElementList(field)) { - return decorateWebElementList(loader, field); + try { + if (isTypifiedElement(field)) { + return decorateTypifiedElement(loader, field); + } + if (isHtmlElement(field)) { + return decorateHtmlElement(loader, field); + } + if (isWebElement(field) && !field.getName().equals("wrappedElement")) { + return decorateWebElement(loader, field); + } + if (isTypifiedElementList(field)) { + return decorateTypifiedElementList(loader, field); + } + if (isHtmlElementList(field)) { + return decorateHtmlElementList(loader, field); + } + if (isWebElementList(field)) { + return decorateWebElementList(loader, field); + } + return null; + } catch (ClassCastException ignore) { + return null; // See bug #94 and NonElementFieldsTest } + } - return null; + public Object decorate(ClassLoader loader, Object outerObject, Field field) + { + try + { + if (isHtmlElement(field)) + return decorateHtmlElement(loader, outerObject, field); + } + catch (ClassCastException ignore) {} + return decorate(loader, field); } protected T decorateTypifiedElement(ClassLoader loader, Field field) { @@ -86,6 +100,13 @@ protected T decorateHtmlElement(ClassLoader loader, Fiel return createHtmlElement((Class) field.getType(), elementToWrap, getElementName(field)); } + protected T decorateHtmlElement(ClassLoader loader, Object outerObject, Field field) { + WebElement elementToWrap = decorateWebElement(loader, field); + + //noinspection unchecked + return createHtmlElement(outerObject, (Class) field.getType(), elementToWrap, getElementName(field)); + } + protected WebElement decorateWebElement(ClassLoader loader, Field field) { ElementLocator locator = factory.createLocator(field); InvocationHandler handler = new WebElementNamedProxyHandler(locator, getElementName(field)); diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/proxyhandlers/WebElementNamedProxyHandler.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/proxyhandlers/WebElementNamedProxyHandler.java index c0233e9f..4f96b2d1 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/proxyhandlers/WebElementNamedProxyHandler.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/loader/decorator/proxyhandlers/WebElementNamedProxyHandler.java @@ -1,20 +1,33 @@ package ru.yandex.qatools.htmlelements.loader.decorator.proxyhandlers; +import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.support.pagefactory.ElementLocator; import org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler; +import org.openqa.selenium.support.ui.Clock; +import org.openqa.selenium.support.ui.SystemClock; import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; /** * @author Alexander Tolmachev starlight@yandex-team.ru * Date: 21.08.12 */ public class WebElementNamedProxyHandler extends LocatingElementHandler { + + public static final int DEFAULT_TIMEOUT = 5; + + private final long timeOutInSeconds; + + private final Clock clock; + private final String name; public WebElementNamedProxyHandler(ElementLocator locator, String name) { super(locator); this.name = name; + this.clock = new SystemClock(); + this.timeOutInSeconds = Integer.getInteger("webdriver.timeouts.implicitlywait", DEFAULT_TIMEOUT); } @Override @@ -22,6 +35,26 @@ public Object invoke(Object o, Method method, Object[] objects) throws Throwable if ("toString".equals(method.getName())) { return name; } - return super.invoke(o, method, objects); + + long end = this.clock.laterBy(TimeUnit.SECONDS.toMillis(this.timeOutInSeconds)); + + StaleElementReferenceException lasException = null; + while (this.clock.isNowBefore(end)) { + try { + return super.invoke(o, method, objects); + } catch (StaleElementReferenceException e) { + lasException = e; + this.waitFor(); + } + } + throw lasException; + } + + protected long sleepFor() { + return 500L; + } + + private void waitFor() throws InterruptedException { + Thread.sleep(this.sleepFor()); } } diff --git a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/utils/HtmlElementUtils.java b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/utils/HtmlElementUtils.java index 8dc14cf0..8c1cd344 100644 --- a/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/utils/HtmlElementUtils.java +++ b/htmlelements-java/src/main/java/ru/yandex/qatools/htmlelements/utils/HtmlElementUtils.java @@ -1,7 +1,7 @@ package ru.yandex.qatools.htmlelements.utils; import com.google.common.collect.Lists; -import org.apache.commons.lang.WordUtils; +import org.apache.commons.lang3.text.WordUtils; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.RemoteWebDriver; @@ -23,21 +23,26 @@ * @author Alexander Tolmachev starlight@yandex-team.ru * Date: 21.08.12 */ -public final class HtmlElementUtils { +public class HtmlElementUtils { private HtmlElementUtils() { } - public static T newInstance(Class clazz, Object... args) throws IllegalAccessException, - InstantiationException, NoSuchMethodException, InvocationTargetException { - if (clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers())) { - Class outerClass = clazz.getDeclaringClass(); - Object outerObject = outerClass.newInstance(); + public static T newInstance(Object outerObject, Class clazz, Object... args) + throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + if (clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers())) return invokeConstructor(clazz, Lists.asList(outerObject, args).toArray()); - } return invokeConstructor(clazz, args); } + + public static T newInstance(Class clazz, Object... args) throws IllegalAccessException, + InstantiationException, NoSuchMethodException, InvocationTargetException { + Class outerClass = clazz.getDeclaringClass(); + Object outerObject = outerClass.newInstance(); + return newInstance(clazz, outerObject, args); + } + public static boolean isHtmlElement(Field field) { return isHtmlElement(field.getType()); } diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/AnnotatedBySuperclassElementsInitializationTest.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/AnnotatedBySuperclassElementsInitializationTest.java index 17d4b960..bb3498e6 100644 --- a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/AnnotatedBySuperclassElementsInitializationTest.java +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/AnnotatedBySuperclassElementsInitializationTest.java @@ -36,7 +36,7 @@ public void populatedAnnotatedBySuperclassHtmlElementShouldBeInitialized() { public void annotatedBySuperclassElementsPageShouldBeInitialized() { AnnotatedBySuperclassElementsPage page = new AnnotatedBySuperclassElementsPage(driver); - assertThat("Htmlelement annotated by superclass should be not null", + assertThat("HtmlElement annotated by superclass should be not null", page.getSearchArrow(), is(notNullValue())); assertThat("List annotated by parameter superclass should be not null", page.getCompanyList(), is(notNullValue())); diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/ComplexStructTest.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/ComplexStructTest.java index 957e5eb7..1014b63d 100644 --- a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/ComplexStructTest.java +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/ComplexStructTest.java @@ -31,7 +31,7 @@ public class ComplexStructTest { public static final String VACANCY_LIST_NAME = "List of vacancies"; private static final int COMPANIES_NUMBER = 3; - private static final int VACANCIES_NUMBER = 3; + private static final int VACANCIES_NUMBER = 4; private WebDriver webDriver; @@ -47,7 +47,7 @@ public void before() { WebElement pager = mock(WebElement.class); List companies = Arrays.asList(company1, company2, company3); - List vacancies = Arrays.asList(vacancy, vacancy, vacancy); + List vacancies = Arrays.asList(vacancy, vacancy, vacancy, vacancy); when(webDriver.findElement(By.cssSelector(WRAPPER_CSS))).thenReturn(wrapper); when(wrapper.findElement(By.cssSelector(PAGER_CSS))).thenReturn(pager); diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/NonElementFieldsTest.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/NonElementFieldsTest.java new file mode 100644 index 00000000..bec36d0c --- /dev/null +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/NonElementFieldsTest.java @@ -0,0 +1,29 @@ +package ru.yandex.qatools.htmlelements; + +import org.junit.Test; +import ru.yandex.qatools.htmlelements.testpages.NonElementFieldsPage; + +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.Matchers.emptyCollectionOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Graham Russell graham@ham1.co.uk + * Date: 24.10.2015 + */ +public class NonElementFieldsTest { + + @Test + public void nonElementPrivateFieldsShouldNotBeDecoratedAsElements() { + + NonElementFieldsPage page = new NonElementFieldsPage(); + + assertThat("Non-WebElement/HtmlElement fields are not touched", + page.rowsCache, is(nullValue())); + assertThat("Non-WebElement/HtmlElement fields are not touched", + page.rowsAsStringCache, is(nullValue())); + assertThat("Non-WebElement/HtmlElement fields are not touched", + page.otherCache, is(emptyCollectionOf(String.class))); + } +} diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/StaleElementReferenceTest.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/StaleElementReferenceTest.java new file mode 100644 index 00000000..207f69a0 --- /dev/null +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/StaleElementReferenceTest.java @@ -0,0 +1,20 @@ +package ru.yandex.qatools.htmlelements; + +import org.junit.Test; +import ru.yandex.qatools.htmlelements.testpages.StaleElementReferencePage; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * @author Artem Eroshenko + */ +public class StaleElementReferenceTest { + + @Test + public void testOutput() { + StaleElementReferencePage staleElementReferencePage = new StaleElementReferencePage(); + assertThat(staleElementReferencePage.getElement().getText(), equalTo(StaleElementReferencePage.ELEMENT_TEXT)); + } + +} diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/UsingTableTest.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/UsingTableTest.java new file mode 100644 index 00000000..c8946b88 --- /dev/null +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/UsingTableTest.java @@ -0,0 +1,132 @@ +package ru.yandex.qatools.htmlelements; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import org.junit.Before; +import org.junit.Test; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import ru.yandex.qatools.htmlelements.element.HtmlElement; +import ru.yandex.qatools.htmlelements.element.Table; +import ru.yandex.qatools.htmlelements.loader.HtmlElementLoader; + +import java.lang.reflect.Field; +import java.util.List; + +import static java.util.Arrays.asList; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * @author Alexander Anikeev iamanikeev@gmail.com + */ +public class UsingTableTest { + + private WebDriver driver = mock(WebDriver.class); + private WebElement formWithTable = mock(WebElement.class); + private WebElement tableOfContents = mock(WebElement.class); + + @Before + public void init() throws IllegalAccessException { + when(driver.findElement(By.className("formWithTable"))).thenReturn(formWithTable); + when(formWithTable.findElement(By.name("tableOfContents"))).thenReturn(tableOfContents); + when(tableOfContents.findElements(By.xpath(".//th"))).thenReturn(TableElement.headers); + when(tableOfContents.findElements(By.xpath(".//tr"))).thenReturn(TableElement.trs); + when(TableElement.tr1.findElements(By.xpath(".//td"))).thenReturn(TableElement.tr1tds); + when(TableElement.tr2.findElements(By.xpath(".//td"))).thenReturn(TableElement.tr2tds); + // All WebElements return field name as getText() + for (Field field : FieldUtils.getAllFields(TableElement.class)) { + if (field.getType().equals(WebElement.class)) { + when(((WebElement) FieldUtils.readStaticField(TableElement.class, field.getName(), true)).getText()) + .thenReturn(field.getName()); + } + } + } + + @Test + public void getHeadings() { + FormWithTable form = new FormWithTable(driver); + assertThat(form.tableOfContents.getHeadings().size(), equalTo(3)); + assertThat(form.tableOfContents.getHeadings().get(0).getText(), equalTo("header1")); + } + + @Test + public void getRows() { + FormWithTable form = new FormWithTable(driver); + assertThat(form.tableOfContents.getRows().size(), equalTo(2)); + assertThat(form.tableOfContents.getRows().get(0).get(0).getText(), equalTo("r1td1")); + } + + @Test + public void getHeadingsAsString() { + FormWithTable form = new FormWithTable(driver); + assertThat(form.tableOfContents.getHeadingsAsString().size(), equalTo(3)); + assertThat(form.tableOfContents.getHeadingsAsString().get(0), equalTo("header1")); + } + + @Test + public void getRowsAsString() { + FormWithTable form = new FormWithTable(driver); + assertThat(form.tableOfContents.getRowsAsString().size(), equalTo(2)); + assertThat(form.tableOfContents.getRowsAsString().get(0).get(0), equalTo("r1td1")); + } + + @Test + public void getRowsAsStringMappedToHeadings() { + FormWithTable form = new FormWithTable(driver); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings().size(), equalTo(2)); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings().get(1).containsKey("header1"), equalTo(true)); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings().get(1).get("header2"), equalTo("r2td2")); + } + + @Test + public void getRowsAsStringMappedToParticularHeadings() { + List headings = asList("header2", "header3"); + FormWithTable form = new FormWithTable(driver); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings(headings).size(), equalTo(2)); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings(headings).get(1).size(), equalTo(2)); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings(headings) + .get(1).containsKey("header1"), equalTo(false)); + assertThat(form.tableOfContents.getRowsAsStringMappedToHeadings(headings) + .get(1).get("header2"), equalTo("r2td2")); + } + + @FindBy(className = "formWithTable") + public class FormWithTable extends HtmlElement { + public FormWithTable(WebDriver driver) { + HtmlElementLoader.populate(this, driver); + } + + @FindBy(name = "tableOfContents") + public Table tableOfContents; + } + + private static class TableElement { + /** Headers */ + static WebElement header1 = mock(WebElement.class); + static WebElement header2 = mock(WebElement.class); + static WebElement header3 = mock(WebElement.class); + /** Rows */ + static WebElement tr1 = mock(WebElement.class); + static WebElement tr2 = mock(WebElement.class); + /** First row elements */ + static WebElement r1td1 = mock(WebElement.class); + static WebElement r1td2 = mock(WebElement.class); + static WebElement r1td3 = mock(WebElement.class); + /** Second row elements */ + static WebElement r2td1 = mock(WebElement.class); + static WebElement r2td2 = mock(WebElement.class); + static WebElement r2td3 = mock(WebElement.class); + + static List trs = asList(tr1, tr2); + static List tr1tds = asList(r1td1, r1td2, r1td3); + static List tr2tds = asList(r2td1, r2td2, r2td3); + static List headers = asList(header1, header2, header3); + } +} diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testelements/MockedForm.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testelements/MockedForm.java index 44c9ed5f..06d1d39f 100644 --- a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testelements/MockedForm.java +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testelements/MockedForm.java @@ -4,9 +4,6 @@ import org.openqa.selenium.WebElement; import ru.yandex.qatools.htmlelements.element.Form; -import java.util.Arrays; -import java.util.Collections; - import static java.util.Collections.singletonList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testpages/NonElementFieldsPage.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testpages/NonElementFieldsPage.java new file mode 100644 index 00000000..ee7e1f24 --- /dev/null +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testpages/NonElementFieldsPage.java @@ -0,0 +1,34 @@ +package ru.yandex.qatools.htmlelements.testpages; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import ru.yandex.qatools.htmlelements.loader.HtmlElementLoader; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.mock; + +/** + * @author Graham Russell graham@ham1.co.uk + * Date: 24.10.2015 + */ +public class NonElementFieldsPage { + + // public for ease of assertion in test + public List> rowsCache; + public List> rowsAsStringCache; + public List otherCache = new ArrayList<>(); + + public NonElementFieldsPage() { + this(mockDriver()); + } + + public NonElementFieldsPage(WebDriver driver) { + HtmlElementLoader.populatePageObject(this, driver); + } + + public static WebDriver mockDriver() { + return mock(WebDriver.class); + } +} diff --git a/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testpages/StaleElementReferencePage.java b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testpages/StaleElementReferencePage.java new file mode 100644 index 00000000..4e3ca977 --- /dev/null +++ b/htmlelements-java/src/test/java/ru/yandex/qatools/htmlelements/testpages/StaleElementReferencePage.java @@ -0,0 +1,51 @@ +package ru.yandex.qatools.htmlelements.testpages; + +import org.openqa.selenium.By; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.loader.HtmlElementLoader; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Artem Eroshenko + */ +public class StaleElementReferencePage { + + public static final String ELEMENT_XPATH = "//div"; + + public static final String ELEMENT_TEXT = "element text"; + + @FindBy(xpath = ELEMENT_XPATH) + private WebElement element; + + public StaleElementReferencePage() { + this(mockDriver()); + } + + public StaleElementReferencePage(WebDriver driver) { + HtmlElementLoader.populatePageObject(this, driver); + } + + public WebElement getElement() { + return element; + } + + public static WebDriver mockDriver() { + + WebDriver driver = mock(WebDriver.class); + WebElement element = mock(WebElement.class); + + when(element.getText()) + .thenThrow(new StaleElementReferenceException("first")) + .thenThrow(new StaleElementReferenceException("second")) + .thenReturn(ELEMENT_TEXT); + + when(driver.findElement(By.xpath(ELEMENT_XPATH))).thenReturn(element); + return driver; + } + +} diff --git a/htmlelements-matchers/pom.xml b/htmlelements-matchers/pom.xml index 4a5fee13..1a844a82 100644 --- a/htmlelements-matchers/pom.xml +++ b/htmlelements-matchers/pom.xml @@ -4,7 +4,7 @@ ru.yandex.qatools.htmlelements htmlelements - 1.16-SNAPSHOT + 1.18-SNAPSHOT htmlelements-matchers diff --git a/htmlelements-matchers/src/main/java/ru/yandex/qatools/htmlelements/matchers/decorators/ConditionMatcherDecorator.java b/htmlelements-matchers/src/main/java/ru/yandex/qatools/htmlelements/matchers/decorators/ConditionMatcherDecorator.java index b23eed21..6314abe7 100644 --- a/htmlelements-matchers/src/main/java/ru/yandex/qatools/htmlelements/matchers/decorators/ConditionMatcherDecorator.java +++ b/htmlelements-matchers/src/main/java/ru/yandex/qatools/htmlelements/matchers/decorators/ConditionMatcherDecorator.java @@ -1,7 +1,7 @@ package ru.yandex.qatools.htmlelements.matchers.decorators; import org.hamcrest.*; -import org.junit.internal.AssumptionViolatedException; +import org.junit.AssumptionViolatedException; /** * @author Alexander Tolmachev starlight@yandex-team.ru @@ -24,14 +24,21 @@ protected boolean matchesSafely(T item) { return matcher.matches(item); } - Description conditionDescription = new StringDescription(); - conditionDescription.appendValue(itemToMatchCondition).appendDescriptionOf(condition); - throw new AssumptionViolatedException(String.format("Condition is not satisfied: %s", conditionDescription)); + Description conditionDescription = + new StringDescription() + .appendValue(itemToMatchCondition) + .appendDescriptionOf(condition); + + throw new AssumptionViolatedException( + String.format("Condition is not satisfied: %s", conditionDescription)); } @Override public void describeTo(Description description) { - description.appendDescriptionOf(matcher).appendText(" if ").appendDescriptionOf(condition); + description + .appendDescriptionOf(matcher) + .appendText(" if ") + .appendDescriptionOf(condition); } @Override diff --git a/htmlelements-thucydides/pom.xml b/htmlelements-thucydides/pom.xml index d76ab321..8d7d4561 100644 --- a/htmlelements-thucydides/pom.xml +++ b/htmlelements-thucydides/pom.xml @@ -3,7 +3,7 @@ htmlelements ru.yandex.qatools.htmlelements - 1.16-SNAPSHOT + 1.18-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index f3aa9322..97759dd9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.yandex.qatools.htmlelements htmlelements - 1.16-SNAPSHOT + 1.18-SNAPSHOT pom Yandex QATools HtmlElements