2016-08-17 4 views
3

У меня есть более 1 XPath, указывающий на веб-элемент, и я хочу определить, являются ли оба элемента эквивалентными (т. Е. Если я выполняю действие sendKeys() или click() на обоих веб-элементах, действие будет выполняться на том же веб-элемент) в настоящее время я проверка равенства, используя следующий метод:Как метод WebElement.equals() проверяет равенство?

WebElement element1 = driver.findElement(By.xpath(".//*[@id='ap_email']")); 
    WebElement element2 = driver.findElement(By.xpath(".//*[@type='email']")); 


    System.out.println(element1.equals(element2)); 

Это возвращает истину до тех пор, как точка XPath к тому же элементу.

Однако я не уверен, как метод определяет равенство? И есть ли какие-либо обстоятельства, когда два веб-элемента на самом деле одинаковы (т. Е. Любое действие, выполняемое на них, будет выполняться на одном и том же веб-элементе), но метод показывает, что они разные? Или наоборот?

Я пытаюсь разработать надежный метод для определения равенства двух веб-элементов.

Я использую Java и Selenium.

Благодаря

+0

WebElement - это интерфейс. Вам нужно будет определить тип фактического объекта, который у вас есть. Затем вы можете найти источник для этого объекта в Интернете, чтобы увидеть реализацию equals() –

ответ

1

Однако, я не уверен, как метод определяет равенство?

Драйвер генерирует опорный сигнал для каждого объекта HTMLElement встречается в документе, и всегда возвращает ту же ссылку для HTMLElement объекта.

Эта ссылка хранится в свойстве WebElement.id на стороне клиента и не имеет ничего общего с атрибутом id, используемым с локатором.

Чтобы определить равенство между двумя WebElement, клиент просто проверяет ссылку, хранящуюся в WebElement.id.

И есть ли какие-либо обстоятельства, когда два веб-элемента на самом деле одинаковы, но метод показывает, что они разные?

Технически говоря, это никогда не случается, и это было бы серьезной проблемой, если бы это было так.

Но это зависит от того, что вы подразумеваете под этим же.Например, кнопка может выглядеть одинаково в два разных момента, но может быть заменена идентичной, которая создаст новую ссылку. Это тот случай, когда страница или некоторые детали перезагружены:

driver.get("http://stackoverflow.com/"); 

    WebElement elementA = driver.findElement(By.cssSelector("#logo")); 
    WebElement elementB = driver.findElement(By.cssSelector("#logo")); 

    boolean same1 = elementA.equals(elementB); // return true 

    elementB.click(); // reloads the page, all the previous web element are now obsolete 

    WebElement elementC = driver.findElement(By.cssSelector("#logo")); 

    boolean same2 = elementA.Equals(elementC); // return false 
0

RemoteWebElement класс, который реализует WebElement. Метод equals сравнивает переменную id, которая является строкой. Если вы создаете два WebElements, даже если они указывают на один и тот же элемент, их значение id будет другим. Идентификатор Infact используется также как haschcode. Вы можете проверить, распечатав идентификатор для обоих элементов.

+0

Спасибо. Не все веб-элементы имеют идентификаторы (например, поле имени пользователя и пароля на Entropay.com), как RemoteWebElement сравнивает их в этом случае? –

+1

Это не имеет ничего общего с CSS id на html. Этот идентификатор создается в классе RemoteWebElement. Проверьте исходный код здесь - http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-remote-driver/2.47.1/org/openqa/selenium/remote/RemoteWebElement .java – Grasshopper

+0

Также вы упомянули «если вы создадите два веб-элемента, даже если они указывают на один и тот же элемент, их значение id будет другим», это, похоже, не так. В моем предыдущем примере в главном сообщении есть два совершенно разных веб-элемента (element1 и element2), а метод equals() возвращает true. Также, если RemoteWebElement не сравнивает идентификатор HTML/CSS на веб-странице, то на самом деле они сравнивают. Я имею в виду, на каком основании они решают, что два элемента одинаковы/различны? –

0

Ниже приведена реализация equals в RemoteWebElement, которая реализует интерфейс WebElement.

В соответствии с этим методом два элемента будут считаться равными, если их идентификаторы одинаковы, где id возвращается из браузера в ответ на findElement. Поэтому, если мы выполним findElement, используя 2 разных xpaths, вы можете проверить атрибут id из возвращаемого элемента в ответ. если оба идентификатора одинаковы, они будут рассматриваться как один и тот же элемент, если они не будут рассматриваться как разные элементы.

public boolean equals(Object obj) { 
if (!(obj instanceof WebElement)) { 
    return false; 
} 

WebElement other = (WebElement) obj; 
while (other instanceof WrapsElement) { 
    other = ((WrapsElement) other).getWrappedElement(); 
} 

if (!(other instanceof RemoteWebElement)) { 
    return false; 
} 

RemoteWebElement otherRemoteWebElement = (RemoteWebElement) other; 

return id.equals(otherRemoteWebElement.id); 

}

Смежные вопросы