Selenium不能使用find_element_by_css_selector()



情况:

首先我想说的是,我是新的硒和决定拿起它来练习一些python。我目前正在网上学习一个教程,并决定制作一个youtube机器人。

代码:

from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
import time
import random

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys


def login_with_username_and_password(browser, username, password):
# FILL UP THE LOGIN FORM
email_input = browser.find_elements('input[type=email]')

email = username
for letter in email:
email_input.send_keys(letter)
wait_time = random.randint(0,1000)/1000
time.sleep(wait_time)

next_button = browser.find_elements_by_css_selector("button")
time.sleep(2)
next_button[2].click()
time.sleep(2)

password_input = browser.find_element_by_css_selector('input[type=password]')
password = password
for letter in password:
password_input.send_keys(letter)
wait_time = random.randint(0,1000)/1000
time.sleep(wait_time)

next_button = browser.find_elements_by_css_selector("button")
time.sleep(2)
next_button[1].click()

confirm_button = browser.find_elements_by_css_selector("div[role=button]")
time.sleep(2)
if(len(confirm_button)>0):
confirm_button[1].click()

def click_on_agree_and_signin(browser):
# agree_button= browser.find_element_by_css_selector('button')
# time.sleep(2)
# agree_button.click()

signin_buttons= browser.find_elements_by_css_selector(".signin")
time.sleep(6) # Wait longer so the message pops up
while(len(signin_buttons)== 0):
signin_buttons= browser.find_elements_by_css_selector(".signin")
time.sleep(1)

signin_buttons[0].click()

def enter_search_term(browser,search_term):
# Enter text on the search term
search_input = browser.find_element_by_id("search")
for letter in search_term:
search_input.send_keys(letter)
wait_time = random.randint(0,1000)/1000
time.sleep(wait_time)

search_input.send_keys(Keys.ENTER)

def enter_comment(browser, comment):
comment_input = browser.find_element_by_css_selector("ytd-comment-simplebox-renderer")

entering_comment_actions = ActionChains(browser)

entering_comment_actions.move_to_element(comment_input)
entering_comment_actions.click()

for letter in comment:
entering_comment_actions.send_keys(letter)
wait_time = random.randint(0,1000)/1000
entering_comment_actions.pause(wait_time)

entering_comment_actions.perform()

time.sleep(1)

send_comment_button = browser.find_element_by_id("submit-button")
send_comment_button.click()

###########################################
#             BOT STARTS HERE             #
###########################################


driver=webdriver.Chrome()
driver.maximize_window
driver.get("https://www.youtube.com/")
all_search_terms = ['online marketing']

# Click Agree and Sing In
click_on_agree_and_signin(driver)

# Sign In
login_with_username_and_password(driver, "hey289895@gmail.com", "-1qa2ws3ed4rf-")
for search_term in all_search_terms:
enter_search_term(driver, search_term)
time.sleep(2)

thumbnails = driver.find_element_by_css_selector("ytd-video-renderer")

for index in range(1, 6):
thumbnails[index].click()
time.sleep(6)
enter_comment(driver, "love it")
driver.execute_script("window.history.go(-1)")
thumbnails = driver.find_element_by_css_selector("ytd-video-renderer")
time.sleep(1)
driver.close()

问题:当运行这段代码时,它会产生一个与find_element_by_css_selector方法相关的错误。最常见的是在sign in阶段,如下图所示。

:

有没有人能解释一下这里发生了什么,我在哪里出错了,以及我该如何解决这个问题。

第一:只有warning,没有error


在我的3.141.0版本中,我可以使用这两种方法

from selenium import webdriver
driver = webdriver.Chrome() # Firefox()
driver.find_elements_by_css_selector(...)
driver.find_elements_by_xpath(...)
# etc.

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome() # Firefox()
driver.find_elements(By.CSS_SELECTOR, ...)
driver.find_elements(By.XPATH, ...)
# etc.

,但似乎他们计划在未来删除功能find_elements_by_...(在版本4.x),现在find_elements_by_...仍然有效,但它显示warning,你应该使用第二种方法find_elements(By.CSS_SELECTOR, ...)

您可以使用模块warnings来隐藏这些警告,但最好只使用第二种方法。


顺便说一句:

在find_elements_by_css_selector的源代码中,你可以看到它运行warning.warn(...),然后运行find_elements(By.CSS_SELECTOR, ...)


查看使用的版本

import selenium
print(selenium.__version__)

相关内容

最新更新