簡體   English   中英

Selenium 無法定位 web 頁面上的元素

[英]Selenium can't locate an element that is on web page

有效的部分代碼:我輸入 USGS 站點和 go 到最新的地震頁面。 現在我要做的是下載最新地震的 csv 文件。 下載按鈕位於頁面末尾,當我運行腳本時,它返回selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element 歡迎任何解決此問題的想法。 提前致謝

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

ser = Service('C:\\chromedriver.exe')
opt = webdriver.ChromeOptions()

web = webdriver.Chrome(service=ser, options=opt)
web.get('https://www.usgs.gov/')

web.find_element(by=By.CSS_SELECTOR, value= '#block-tools > div > p > a:nth-child(1)').click()
web.maximize_window()

web.find_element(by=By.CSS_SELECTOR, value= 'body > usgs-root > div > usgs-list > cdk-virtual-scroll-viewport > div.cdk-virtual-scroll-content-wrapper > usgs-download-button > div > button > span.mat-button-wrapper').click()

downloadCsv = web.find_element(by=By.CSS_SELECTOR, value='#mat-dialog-1 > usgs-download-options > div.mat-dialog-content > ul > li:nth-child(2) > a')
downloadCsv.click()

您需要等待元素加載,顯式等待或者您可以添加隱式等待web.implicitly_wait(10)您可以使用sleep(10)來測試它是否是問題所在

請參閱https://selenium-python.readthedocs.io/waits.html'

另外,你需要切換到新標簽

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# used this lib to update my chrome driver automatically
from webdriver_manager.chrome import ChromeDriverManager

opt = webdriver.ChromeOptions()

web = webdriver.Chrome(ChromeDriverManager().install(), options=opt)
web.get('https://www.usgs.gov/')


try:
    web.maximize_window()
    element = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#block-tools > div > p > a:nth-child(1)'))
    )
    element.click()

    # after click you need to switch to the new tab
    web.switch_to.window(web.window_handles[1])

    element = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'body > usgs-root > div > usgs-list > cdk-virtual-scroll-viewport > div.cdk-virtual-scroll-content-wrapper > usgs-download-button > div > button > span.mat-button-wrapper'))
    )
    element.click()

    # your css selector did not work so I changed it

    element = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'usgs-download-options > div.mat-dialog-content > ul > li:nth-child(2) > a'))
    )
    element.click()
finally:
    web.quit()

PS 如果你的整個 selenium 只是為了這個我想你可以使用更簡單和更快的腳本直接下載 CSV,因為 CSV 作為直接下載鏈接,除了我遺漏了一些東西

import csv
import requests

CSV_URL = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.csv'

with requests.Session() as s:
    download = s.get(CSV_URL)

    decoded_content = download.content.decode('utf-8')

    cr = csv.reader(decoded_content.splitlines(), delimiter=',')
    my_list = list(cr)
    for row in my_list:
        print(row)

#             or write to file
    local_filename = CSV_URL.split('/')[-1]

    with open(local_filename, 'wb') as f:
        for chunk in download.iter_content(chunk_size=8192):
            # If you have chunk encoded response uncomment if
            # and set chunk_size parameter to None.
            # if chunk:
            f.write(chunk)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM