Python Selenium — проверьте, равен ли WebElement другому WebElement

Как сравнить два Selenium WebElements, чтобы увидеть, одинаковы ли они?

Сначала я получаю список элементов input_fields и first_input:

self.input_fields = driver.find_elements(By.CLASS_NAME, class_name) self.first_input = driver.find_element(By.ID, id)

Затем я пытаюсь проверить, являются ли input_fields[0] и first_input одним и тем же WebElement.

if self.first_input is not self.input_fields[0]:
    self.__log.warning("WebElement first_input : {} != {}".format(self.first_input, self.input_fields[0]))

Хотя session и element одинаковы, предупреждающее сообщение выдается в любом случае.

WARNING  - WebElement first_input: <selenium.webdriver.remote.webelement.WebElement (session="796bf0bcf3e0df528ee932d477951689", element="94a2ee62-9511-45e5-8aa3-bd3d3e9be309")> != <selenium.webdriver.remote.webelement.WebElement (session="796bf0bcf3e0df528ee932d477951689", element="94a2ee62-9511-45e5-8aa3-bd3d3e9be309")>

person Marco D.G.    schedule 06.08.2019    source источник
comment
Похоже, вы пытаетесь сравнить два веб-элемента. Вы не можете сравнить два веб-элемента. Если вы хотите сравнить тег inputs, сравните их атрибут или текстовое значение.   -  person KunduK    schedule 06.08.2019


Ответы (2)


Изменить: использование != вместо is not решило бы все:

if self.first_input != self.input_fields[0]:

Решение

if self.first_input.id == self.input_fields[0].id:
    self.__log.info("Same element {} , {}".format(self.first_input.id, self.input_fields[0].id))

Читая документы, я нашел id, чье definition служит получателем для закрытого атрибута_id

@property
def id(self):
    """Internal ID used by selenium.

    This is mainly for internal use. Simple use cases such as checking if 2
    webelements refer to the same element, can be done using ``==``::

        if element1 == element2:
            print("These 2 are equal")

    """
    return self._id

источник

class WebElement(object):
    def __init__(self, parent, id_, w3c=False):
        self._parent = parent
        self._id = id_
        self._w3c = w3c

Примечание:

print("{}".format(self.first_input.id))

Дает нам идентификатор элемента, который совпадает с тем, который мы видели в объекте.

94a2ee62-9511-45e5-8aa3-bd3d3e9be309
person Marco D.G.    schedule 06.08.2019

Сравните WebElements, должно работать, напечатайте id first_element и input_fields[0] для проверки. Кроме того, выведите все идентификаторы из input_fields, чтобы проверить, нет ли повторяющихся элементов с одинаковым идентификатором.

Как вариант, вы можете попробовать сравнить полный путь CSS двух элементов, источник.

script = """
function fullPath(element){
  var names = [];
  while (element.parentNode) {
      if (element==element.ownerDocument.documentElement) names.unshift(element.tagName);
      else{
        for (var i=1, e=element; e.previousElementSibling; e=e.previousElementSibling,i++);
        names.unshift(element.tagName+":nth-child("+i+")");
      }
      element=element.parentNode;
  }
  return names.join(" > ");
}
return fullPath(arguments[0]);
"""

first_input_full_path = driver.execute_script(script, self.first_input)
another_input_full_path = driver.execute_script(script, self.input_fields[0])

if first_input_full_path == another_input_full_path:
    self.__log.warning("WebElement first_input : {} != {}".format(self.first_input, self.input_fields[0]))
person Sers    schedule 06.08.2019