📌  相关文章
📜  不推荐使用 find_element_by_* 命令.请改用 find_element() (1)

📅  最后修改于: 2023-12-03 15:35:55.128000             🧑  作者: Mango

不推荐使用 find_element_by_* 命令.请改用 find_element()

简介

在 Selenium WebDriver 的 API 中,有一组方法以 find_element_by_* 命名,如 find_element_by_idfind_element_by_namefind_element_by_xpath 等等。这些方法是用来查找页面中的元素的,但是相较于 find_element() 方法,这些命名方式存在风险和不便。

风险
风险1:维护性较差

find_element_by_* 方法的命名方式类似于字符串拼接,容易出现代码中出现大量的字符串,增加了修改和维护代码的难度。同时也不利于代码重构和测试脚本的重用。

风险2:代码脆弱性较高

find_element_by_* 方法返回的是一个 WebElement 对象,如果页面中没有匹配的元素或匹配的元素太多,这些方法会抛出异常。这会使得你的代码很容易被错误打断。另外,由于这些方法需要完整的元素定位信息,所以它们的执行速度较慢。

不便
不便1:不适用与多个选择器

find_element_by_* 方法只能接收一种选择器作为参数,这意味着如果你想通过多个选择器来搜索一个元素,你必须多次调用该方法。

不便2:不易扩展

find_element_by_* 方法只支持少数几种选择器,如果你想使用其他选择器(如 CSS 选择器),就需要自己去实现。这增加了学习和开发的难度。

解决方案

为了解决上述问题,Selenium WebDriver 提供了一个更通用和灵活的 find_element() 方法。find_element() 方法可以接收多种类型的选择器,如 ID、CSS 选择器、XPath 等等。它也会返回一个 WebElement 对象,但是如果没有找到匹配的元素,它会返回 None,这也减少了错误的发生。

使用 find_element() 方法,你可以轻松地修改和维护脚本,因为不需要处理大量的字符串。而且,由于 find_element() 方法是通用的,所以你可以使用更多种类型的选择器,使你的代码更加简洁和可读。

示例代码

下面是一个使用 find_element_by_* 方法的例子:

from selenium import webdriver

def search_google(query):
    driver = webdriver.Chrome()
    driver.get("https://www.google.com/")

    search_box = driver.find_element_by_name("q")
    search_box.send_keys(query)
    search_box.submit()

    driver.close()

下面是使用 find_element() 方法的修改后的例子:

from selenium import webdriver

def search_google(query):
    driver = webdriver.Chrome()
    driver.get("https://www.google.com/")

    search_box = driver.find_element(by='name', value='q')
    search_box.send_keys(query)
    search_box.submit()

    driver.close()

你也可以使用其他选择器,如 CSS 选择器:

from selenium import webdriver

def search_google(query):
    driver = webdriver.Chrome()
    driver.get("https://www.google.com/")

    search_box = driver.find_element(by='css selector', value='input[name="q"]')
    search_box.send_keys(query)
    search_box.submit()

    driver.close()
总结

虽然 find_element_by_* 方法很方便,但是它们存在一些风险和不便。使用 find_element() 方法可以解决这些问题,使你的代码更加稳定和灵活。