NoSuchElementException và SyntaxError trong quá trình quét web

Sep 01 2020

Tôi gặp một số khó khăn khi áp dụng đề xuất này để khắc phục lỗi sau:

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

nhận được khi tôi sử dụng mã sau:

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()

Như đã giải thích ở đây: NoSuchElementException - Không thể định vị phần tử , tôi nên sử dụng một cái gì đó như thế này

WebDriverWait wait = new WebDriverWait(driver, 10);

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

Nhưng tôi gặp lỗi SyntaxError (do WebDriverWait wait =).

Tôi cũng đã cố gắng làm theo những câu trả lời sau:

NoSuchElementException (SyntaxError: quá nhiều khối lồng nhau tĩnh)

Selenium Webdriver - NoSuchElementExceptions

nhưng tôi vẫn gặp lỗi:

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

    break
except NoSuchElementException:
    time.sleep(1)

cho tôi break outside the loop; trong khi cái này

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

except NoSuchElementException:         
    pass

không thay đổi bất cứ điều gì (vẫn cho tôi lỗi NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"}:)

Bạn có thể vui lòng giúp tôi để tìm ra một cách để sửa chữa những lỗi này?

Cập nhật: Tôi cũng đã thử sử dụng driver.implicitly_wait(60)và NoSuchElementExpectiongặp lỗi tương tự .

Chi tiết hơn về lỗi:

---> 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(

Trả lời

rahulrai Sep 02 2020 at 04:59

Bạn đã làm tất cả mọi thứ wright trong mã của bạn chia sẻ ở trên, ngoại trừ dòng này: search.submit(). Khi bạn đang gọi submit()phương thức của phần tử web và tìm kiếm phần tử do bạn xác định không phải là hình thức thay vì nó là một Textarea, do đó NoSuchElementException. Bởi vì phương pháp gửi chỉ có thể áp dụng cho formloại phần tử. Nếu bạn xóa dòng này, mã của bạn sẽ hoạt động tốt.

từ webdriver nhập khẩu selen

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)

Đầu ra

Ghi chú :

Để biết cách sử dụng các cơ chế chờ khác nhau trong trăn selen, dưới đây có thể là một bài đọc hay:

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>

Xpath có thể là:

//*[@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

Về cơ bản, hãy đợi một phần tử và gửi truy vấn và nhấn gửi.

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

Cũng thêm những

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