为什么要使用find_element(By...)而不是find_element_by_...?

14

使用selenium.webdriver.common.by中的By相比于普通的find_element_by_...方法有什么目的和优势?例如:

driver.find_element_by_id('some_ID')

对比:

from selenium.webdriver.common.by import By
driver.find_element(By.ID, 'some_ID')
4个回答

23
根据文档find_element()似乎是一种类似于“私有”方法,它被find_element_by_...()方法使用,也可能在页面对象中使用。
因此,使用页面对象模式是你可能需要find_element()+By而不是find_element_by_...()的原因。
例如,你有一个包含元素id值的变量。
link_id = "some_id"

并且你可以使用它来定位元素,例如

my_link = driver.find_element_by_id(link_id)

如果某些原因导致元素的 id 属性被删除,您需要更新选择器并替换 my_link 中的 find_element_by_...() 方法。
link_class_name = "some_class_name"
my_link = driver.find_element_by_class_name(link_class_name)

如果您使用 By,则初始定位器可能为:
link_locator = (By.ID, "some_id")

并且您将元素定位为

my_link = find_element(*link_locator)

如果 HTML 源代码发生变化,您只需要更新您的 link_locator 即可。

link_locator = (By.CLASS_NAME, "some_class_name")

而且my_link保持完全不变


谢谢你的回答。似乎By可以用来使测试更灵活、更易于维护。 我对页面对象模型感到非常困惑,还无法理解这个概念。 - Arthur
仅使用By.定位器类型只返回一个字符串。为什么不直接运行 driver.find_element("css selector", "[css='something']"?看起来By大多数情况下是无用的,因为我们可以轻松地自己传入这些字符串。 - Arthur
是的.. By() 类中的所有变量都是简单字符串,您可以使用 "id" 代替 By.ID"xpath" 代替 By.XPATH。我认为这只是为了增加一点冗余并简化在 IDE 中的工作-当输入 By. 时,您可以看到可用选项,例如在 PyCharm 中。 - Andersson
怎么导入这个“By”?-> 好的,明白了 from selenium.webdriver.common.by import By 应该要提一下。 - Nikhil VJ

2

像上面的回答一样。当使用find_element_by_id等方法时,我收到了已弃用的消息。因此,最好的方法是使用find_element()


1

在新版的Python中,find_element_by_...() 已被移除,因此只需使用 find_element() + By


1
这两种方法都来自RemoteWebDriver类。
findElement(By.id()) requires you to created your own By.id instance.
findElementById(String) is a helper function that will generate the By.id
instance for you.

这归结于为您提供灵活性,选择在测试/框架中要跟踪的内容。您想将定位器作为字符串跟踪吗?还是想将定位器作为By对象跟踪?


2
OP正在寻找Python的答案。由于Python+SeleniumJava+Selenium存在几个差异,因此您的解释在这种情况下不适用。 - Andersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接