NoSuchElementException dan SyntaxError selama web-scraping

Sep 01 2020

Saya mengalami beberapa kesulitan dalam menerapkan saran ini untuk memperbaiki kesalahan berikut:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"}

dapatkan ketika saya menggunakan kode berikut:

from selenium import webdriver

query = ' I want to try to translate this text'
chrome_options = webdriver.ChromeOptions('/chromedriver')
driver = webdriver.Chrome()
driver.get('https://translate.google.com/')
search = driver.find_element_by_css_selector('#source')
search.send_keys(query)
search.submit()

Seperti yang dijelaskan di sini: NoSuchElementException - Tidak dapat menemukan elemen , saya harus menggunakan sesuatu seperti ini

WebDriverWait wait = new WebDriverWait(driver, 10);

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("source"));

Tapi saya mendapatkan SyntaxError (karena WebDriverWait wait =).

Saya juga mencoba mengikuti jawaban ini:

NoSuchElementException (SyntaxError: terlalu banyak blok bertingkat secara statis)

Selenium Webdriver - NoSuchElementExceptions

tapi saya masih mendapatkan kesalahan:

try:
    search = driver.find_element_by_css_selector('#source')

    break
except NoSuchElementException:
    time.sleep(1)

memberi saya break outside the loop; sedangkan ini

try:
    search = driver.find_element_by_css_selector('#source')

except NoSuchElementException:         
    pass

tidak mengubah apa pun (masih memberi saya kesalahan: NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"})

Bisakah Anda membantu saya menemukan cara untuk memperbaiki kesalahan ini?

Pembaruan: Saya juga mencoba menggunakan driver.implicitly_wait(60)dan saya mendapat NoSuchElementExpectionkesalahan yang sama .

Lebih detail tentang kesalahan:

---> 23     search.submit()
     24 
     25 

~/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py in submit(self)
     83         """Submits a form."""
     84         if self._w3c:
---> 85             form = self.find_element(By.XPATH, "./ancestor-or-self::form")
     86             self._parent.execute_script(

Jawaban

rahulrai Sep 02 2020 at 04:59

Anda telah melakukan segalanya wright dalam kode Anda bersama di atas kecuali baris ini: search.submit(). Karena Anda memanggil submit()metode elemen web dan pencarian elemen yang Anda definisikan tidak ada bentuk melainkan an Textarea, maka NoSuchElementException. Karena metode submit hanya berlaku untuk formjenis elemen. Jika Anda menghapus baris ini, kode Anda akan berfungsi dengan baik.

dari selenium import webdriver

query = ' I want to try to translate this text'
chrome_options = webdriver.ChromeOptions('/chromedriver')
driver = webdriver.Chrome()
driver.get('https://translate.google.com/')
search = driver.find_element_by_css_selector('#source')
search.send_keys(query)

Keluaran

Catatan :

Untuk mengetahui cara menggunakan mekanisme tunggu yang berbeda pada selenium python, di bawah ini bisa menjadi bacaan yang bagus:

https://selenium-python.readthedocs.io/waits.html

ArundeepChohan Sep 02 2020 at 02:16
<textarea id="source" class="orig tlid-source-text-input goog-textarea" rows="1" spellcheck="false" autocapitalize="off" autocomplete="off" autocorrect="off" style="overflow: auto hidden; box-sizing: border-box; height: 70px; padding-bottom: 18px;"></textarea>

Xpaths bisa berupa:

//*[@id='source']

/html/body/div[2]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[2]/div/div/div[1]/textarea

Pada dasarnya tunggu elemen dan kirim kueri dan tekan kirim.

search = WebDriverWait(driver, 10).until( 
        EC.presence_of_element_located((By.XPATH, //*[@id='source'])) 
search.send_keys(query)
search.submit()

Tambahkan juga ini

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