Python Selenium - 检查一个 WebElement 是否等于另一个 WebElement
Python Selenium - Check if a WebElement is equal to another 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")>
编辑:
使用 !=
而不是 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 property, whose definition 用作私有属性的 getter _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))
为我们提供了与我们在对象中看到的相同的元素 ID。
94a2ee62-9511-45e5-8aa3-bd3d3e9be309
比较 WebElements 应该可以工作,打印 first_element
和 input_fields[0]
的 id 进行检查。此外,打印 input_fields
的所有 ids 以检查是否存在具有相同 id 的重复元素。
作为一个选项,您可以尝试比较两个元素的完整 CSS 路径,source。
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]))
如何比较两个 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")>
编辑:
使用 !=
而不是 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 property, whose definition 用作私有属性的 getter _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))
为我们提供了与我们在对象中看到的相同的元素 ID。
94a2ee62-9511-45e5-8aa3-bd3d3e9be309
比较 WebElements 应该可以工作,打印 first_element
和 input_fields[0]
的 id 进行检查。此外,打印 input_fields
的所有 ids 以检查是否存在具有相同 id 的重复元素。
作为一个选项,您可以尝试比较两个元素的完整 CSS 路径,source。
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]))