无法周期性点击不同的类别以访问目标页面



我用python结合Selenium编写了一个脚本,点击几个类别到达网站的目标页面。我的以下脚本可以执行一次相同的操作,但是当重复该过程时,它会抛出stale element错误。我怎样才能让它成功?

这是我的尝试:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = "https://www.courts.com.sg/"
def get_information(driver,mlink):
driver.get(mlink)
#the following line click on the menu
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'span.nav-toggle'))).click()
# It now clicks on the individual categories
for item in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,'#menu-top1535320854159022796-menu .nav-anchor .opener'))):
item.click()
# It then click on the sub-categories
for link in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.nav-dropdown h3 a'))):
link.click()
# Then on the target items
for ilink in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,'li.show a')))[1:]:
ilink.click()
#this is where the scripts throws "stale element error" never gets back to repeat the process

if __name__ == '__main__':
driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)
try:
get_information(driver,url)
finally:  
driver.quit()

你会得到stale element,因为当你将鼠标悬停在菜单上时会打开,当你在循环中点击一些时,菜单会消失。
解决方案 1 - 获取所有子菜单链接而不打开菜单:

def get_information(driver,mlink):
driver.get(mlink)
submenu_links = []
submenus = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.submenu li a')))
for submenu in submenus:
submenu_links.append(submenu.get_attribute("href"))
for link in submenu_links
driver.get(link)

解决方案 2 - 如果必须打开菜单:

def get_information(driver,mlink):
driver.get(mlink)
#the following line click on the menu, what is this and why?
#wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'span.nav-toggle'))).click()
# It now clicks on the individual categories
menus = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,'.navigation li.nav-item')))
for menu in menus:
ActionChains(driver).move_to_element(menu).perform()
submenu_links = []
submenus = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.submenu li a')))
for submenu in submenus:
submenu_links.append(submenu.get_attribute("href"))
for link in submenu_links
driver.get(link)

以下是解决问题的不同方法...(我不链接CSS选择器:)(

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from bs4 import BeautifulSoup
url_list = []
url = "https://www.courts.com.sg/"
def get_information(driver,mlink):
driver.get(mlink)
sleep(5)
soup = BeautifulSoup(driver.page_source)
uls = soup.find_all('ul', {'class': 'nav-mobile'})
for li in uls[0].find_all('li', {'class': 'nav-item'}):
submenu = li.find_all('div', {'class':'nav-dropdown'})
uls = submenu[0].find_all('ul')
for ul in uls:
all_li = ul.find_all('li')
for i in range(1,len(all_li)):
a = all_li[i].find_all('a')
print(a)
a = 'https://www.courts.com.sg' + a[0].get('href')
url_list.append(a)
if __name__ == '__main__':
driver = webdriver.Chrome('C:/Users/sarthak_negi_/Downloads/chromedriver_win32/chromedriver.exe')
wait = WebDriverWait(driver,10)
try:
get_information(driver,url)
finally:  
driver.quit()

url_list包含下拉选项的所有链接。对它们进行获取,您可以访问该页面。希望这有帮助!!

最新更新