不建议使用Selenium中的find_element_by_* 命令

u0njafvf  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(222)

启动功能时

def run(driver_path):
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://tproger.ru/quiz/real-programmer/')
    button = driver.find_element_by_class_name("quiz_button")
    button.click()
run(driver_path)

我收到如下错误:

<ipython-input-27-c5a7960e105f>:6: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(executable_path=driver_path)
<ipython-input-27-c5a7960e105f>:10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  button = driver.find_element_by_class_name("quiz_button")

......但我不明白为什么。
我正在使用最新版本的WebDriver为我的Chrome版本。我不知道为什么我得到

find_element_by_* commands are deprecated

...当文档中有该命令时。

ikfrs5lh

ikfrs5lh1#

此错误消息...

DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead

...表示在最新的Selenium Python库中不赞成使用 find_element_by_* 命令。
正如AutomatedTester提到的:此 DeprecationWarning 反映了针对简化跨语言API的决策所做的更改,而这正是所做的更改。

溶液

而必须使用 find_element()。例如:
必须包括以下导入

from selenium.webdriver.common.by import By
  • 使用class_name
button = driver.find_element_by_class_name("quiz_button")

需要替换为:

button = driver.find_element(By.CLASS_NAME, "quiz_button")

沿着的思路,您还必须更改以下内容:

  • 使用id
element = find_element_by_id("element_id")

需要替换为:

element = driver.find_element(By.ID, "element_id")
  • 使用name
element = find_element_by_name("element_name")

需要替换为:

element = driver.find_element(By.NAME, "element_name")
  • 使用link_text
element = find_element_by_link_text("element_link_text")

需要替换为:

element = driver.find_element(By.LINK_TEXT, "element_link_text")
  • 使用partial_link_text
element = find_element_by_partial_link_text("element_partial_link_text")

需要替换为:

element = driver.find_element(By.PARTIAL_LINK_TEXT, "element_partial_link_text")
  • 使用tag_name
element = find_element_by_tag_name("element_tag_name")

需要替换为:

element = driver.find_element(By.TAG_NAME, "element_tag_name")
  • 使用css_selector
element = find_element_by_css_selector("element_css_selector")

需要替换为:

element = driver.find_element(By.CSS_SELECTOR, "element_css_selector")
  • 使用xpath
element = find_element_by_xpath("element_xpath")

需要替换为:

element = driver.find_element(By.XPATH, "element_xpath")

**注意:**如果您要搜索与替换以实现上述更改,则需要对find_elements_*(即find_element_*得复数形式)执行相同得操作.

您可能还会发现本升级指南很有用,因为它涵盖了升级时可能需要进行的一些其他不相关的更改:***

qxgroojn

qxgroojn2#

@DebanjanB提到并解释了新的结构。另外,最好使用这些行:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service

s = Service('C:/Users/.../chromedriver.exe')
driver = webdriver.Chrome(service=s)
nukf8bse

nukf8bse3#

正如其他人提到的,您应该使用find_element()find_elements(),而不是find_element_by_*()find_elements_by_*()
我编写了regex模式来将过时的方法替换为新方法,所以如果需要的话可以尝试一下。

# from - e.g. find_element_by_id("test")

find_element(s?)_by_([a-z]+)\((.*)

# to - e.g. find_element(By.ID, "test")

find_element$1(By.\U$2\E, $3

注意:您需要导入行才能使用新方法

from selenium.webdriver.common.by import By
j9per5c4

j9per5c44#

感谢@Stephen和 undetected Selenium 的回答。在阅读了一段时间关于如何在哪里找到send_key的例子之后,我发现了一个惊人的例子要点。
下面的send_keys示例对我很有效:

browser = webdriver.Chrome()
def test_key_down(driver):
    driver.get('https://www.selenium.dev/selenium/web/single_text_input.html?#')

    ActionChains(driver) \
        .send_keys("abc") \
        .perform()

test_key_down(browser)

相关问题