📅  最后修改于: 2023-12-03 15:35:55.128000             🧑  作者: Mango
在 Selenium WebDriver 的 API 中,有一组方法以 find_element_by_*
命名,如 find_element_by_id
、find_element_by_name
、find_element_by_xpath
等等。这些方法是用来查找页面中的元素的,但是相较于 find_element()
方法,这些命名方式存在风险和不便。
find_element_by_*
方法的命名方式类似于字符串拼接,容易出现代码中出现大量的字符串,增加了修改和维护代码的难度。同时也不利于代码重构和测试脚本的重用。
find_element_by_*
方法返回的是一个 WebElement
对象,如果页面中没有匹配的元素或匹配的元素太多,这些方法会抛出异常。这会使得你的代码很容易被错误打断。另外,由于这些方法需要完整的元素定位信息,所以它们的执行速度较慢。
find_element_by_*
方法只能接收一种选择器作为参数,这意味着如果你想通过多个选择器来搜索一个元素,你必须多次调用该方法。
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()
方法可以解决这些问题,使你的代码更加稳定和灵活。