NoSuchElementException và SyntaxError trong quá trình quét web
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
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
<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