【问题标题】:except problem while using selenium in python除了在 python 中使用 selenium 时出现问题
【发布时间】:2021-08-04 14:12:09
【问题描述】:

我的代码有问题,希望有人能帮我解决这个问题

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver import ActionChains


PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

driver.get("https://ofersale.ofermalls.co.il/LogoHunter/?utm_source=&utm_medium=&utm_campaign=&tp=replay")
#print(driver.self.driver.title)

search = driver.find_element_by_name("theCode")
search.send_keys("135205")
search.send_keys(Keys.RETURN)

inputt = driver.find_element_by_xpath('//a[@href="javascript: CheckCode()"]')
inputt.click()

try:
    #yolo element
    picture = driver.find_element_by_xpath('//img[@src="images/yolo.jpg"]')
except:
    driver.find_element_by_xpath('//img[@src="images/yolo.jpg"]')
else:
    try:
        #yolo element
        picture = driver.find_element_by_xpath('//img[@src="images/golf.jpg"]') 
    except:
        picture = driver.find_element_by_xpath('//img[@src="images/golf.jpg"]') 
    else:
        try:
            #yolo element
            picture = driver.find_element_by_xpath('//img[@src="images/vardinon.jpg"]')
        except:
            picture = driver.find_element_by_xpath('//img[@src="images/vardinon.jpg"]')
        else:
            try:
                #yolo element
                picture = driver.find_element_by_xpath('//img[@src="images/miniso.jpg"]')
            except:
                picture = driver.find_element_by_xpath('//img[@src="images/miniso.jpg"]')
            else:
                try:
                    #yolo element
                    picture = driver.find_element_by_xpath('//img[@src="images/stemanski.jpg"]')
                except:
                    picture = driver.find_element_by_xpath('//img[@src="images/stemanski.jpg"]')
                else:
                    try:
                        #yolo element
                        picture = driver.find_element_by_xpath('//img[@src="images/jump_onot.jpg"]')
                    except:
                        picture = driver.find_element_by_xpath('//img[@src="images/jump_onot.jpg"]')
                    else:
                        try:
                            #yolo element
                            picture = driver.find_element_by_xpath('//img[@src="images/timberland.jpg"]')
                        except:
                            picture = driver.find_element_by_xpath('//img[@src="images/timberland.jpg"]')
                        else:
                            try:
                                #yolo element
                                picture = driver.find_element_by_xpath('//img[@src="images/crazy_line.jpg"]')
                            except:
                                picture = driver.find_element_by_xpath('//img[@src="images/crazy_line.jpg"]')
                            else:
                                try:
                                    #yolo element
                                    picture = driver.find_element_by_xpath('//img[@src="images/nautica.jpg"]')
                                except:
                                    picture = driver.find_element_by_xpath('//img[@src="images/nautica.jpg"]')
                                else:
                                    try:
                                        #yolo element
                                        picture = driver.find_element_by_xpath('//img[@src="images/polgat.jpg"]')
                                    except:
                                        picture = driver.find_element_by_xpath('//img[@src="images/polgat.jpg"]')
                                    else:
                                        try:
                                            #yolo element
                                            picture = driver.find_element_by_xpath('//img[@src="images/gali.jpg"]')
                                        except:
                                            picture = driver.find_element_by_xpath('//img[@src="images/gali.jpg"]')
                                        else:
                                            print("error while trying to find an xpath")

#main = driver.find_element_by_id("main")

#time.sleep(5)

#sel:driver.quit()

这是代码,问题是当我运行代码时,这是我得到的输出:

Traceback (most recent call last):
  File "D:\Sublime Text 3\web2", line 23, in <module>
    picture = driver.find_element_by_xpath('//img[@src="images/yolo.jpg"]')
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//img[@src="images/yolo.jpg"]"}
  (Session info: chrome=92.0.4515.131)


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Sublime Text 3\web2", line 25, in <module>
    driver.find_element_by_xpath('//img[@src="images/yolo.jpg"]')
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\itay\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//img[@src="images/yolo.jpg"]"}
  (Session info: chrome=92.0.4515.131)

如果有人知道我该如何解决这个问题,我会很高兴的。

非常感谢!

【问题讨论】:

  • 要么捕获这个异常,要么检查元素是否存在。这发生在 except 部分,所以你不会抓住它。您实际上正在做同样的事情,这首先导致了异常。另外,请不要在这里转储整个代码。此外,根据经验,如果缩进如此深入,并且必须复制粘贴代码的一部分,那么您应该重新考虑您在做什么并寻找更好的方法。
  • 错误消息说还找不到元素。虽然页面中可能没有这样的元素,但也有可能该元素已加载到页面中。您可能想要搜索隐式等待硒以获取更多详细信息。
  • 在每个except 中运行与try 完全相同的代码 - 因此它可能会再次生成相同的错误,但现在它不在try 内,因此会引发错误。 except 不会捕获您在 except 中的代码中的错误 - 它需要另一个 try/except。但我不明白你为什么运行完全相同的代码。也许你应该使用sleep 来等待这个元素,或者你应该把它放在try/except 或者你应该在Selenium 中使用waits

标签: python python-3.x selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

在每个 except 中,您运行的代码与 try 中完全相同 - 因此它可能会再次生成相同的错误,但现在它不在 try 内,因此它不会捕获它,但它会引发并停止代码。

对于您的 exceptelse 毫无意义。我认为它应该直接在except 中使用try 而不是else

try:
    print('[DEBUG] checking: yolo')
    picture = driver.find_element_by_xpath('//img[@src="images/yolo.jpg"]')
except:
    try:
        print('[DEBUG] checking: golf')
        picture = driver.find_element_by_xpath('//img[@src="images/golf.jpg"]') 
    except:
        try:
            print('[DEBUG] checking: vardinon')
            picture = driver.find_element_by_xpath('//img[@src="images/vardinon.jpg"]')
        except:
            try:
                print('[DEBUG] checking: miniso')
                picture = driver.find_element_by_xpath('//img[@src="images/miniso.jpg"]')
            except:
                try:
                    print('[DEBUG] checking: stemanski')
                    picture = driver.find_element_by_xpath('//img[@src="images/stemanski.jpg"]')
                except:
                    try:
                        print('[DEBUG] checking: jump_onot')
                        picture = driver.find_element_by_xpath('//img[@src="images/jump_onot.jpg"]')
                    except:
                        try:
                            print('[DEBUG] checking: timberland')
                            picture = driver.find_element_by_xpath('//img[@src="images/timberland.jpg"]')
                        except:
                            try:
                                print('[DEBUG] checking: crazy_line')
                                picture = driver.find_element_by_xpath('//img[@src="images/crazy_line.jpg"]')
                            except:
                                try:
                                    print('[DEBUG] checking: nautica')
                                    picture = driver.find_element_by_xpath('//img[@src="images/nautica.jpg"]')
                                except:
                                    try:
                                        print('[DEBUG] checking: polgat')
                                        picture = driver.find_element_by_xpath('//img[@src="images/polgat.jpg"]')
                                    except:
                                        try:
                                            print('[DEBUG] checking: gali')
                                            picture = driver.find_element_by_xpath('//img[@src="images/gali.jpg"]')
                                        except:
                                            print("error while trying to find an xpath")
                                            picture = None

print(picture)

你甚至可以使用for-loop 来让它更简单

picture = None # assign default value before loop

for name in ['yolo', 'golf', 'vardinon', 'miniso', 'stemanski', 'jump_onot', 'timberland', 'crazy_line', 'nautica', 'polgat', 'gali']:
    try:
        print(f'[DEBUG] checking: {name}')
        picture = driver.find_element_by_xpath(f'//img[@src="images/{name}.jpg"]')
        break  # exit loop
    except:
        pass

if picture is None:
   print("error while trying to find an xpath")

print(picture)

你也可以使用特殊构造for/break/else

for name in ['yolo', 'golf', 'vardinon', 'miniso', 'stemanski', 'jump_onot', 'timberland', 'crazy_line', 'nautica', 'polgat', 'gali']:
    try:
        print(f'[DEBUG] checking: {name}')
        picture = driver.find_element_by_xpath(f'//img[@src="images/{name}.jpg"]')
        break
    except:
        pass
else:  # if `break` was not used in `for`-loop
   print("error while trying to find an xpath")
   picture = None

print(picture)

【讨论】:

    【解决方案2】:

    你的 try-catch 块分开的奇怪用法,你得到的实际异常是no such element,这通常意味着在你的代码尝试时(或几个尝试)访问它。

    在尝试通过代码与网页交互时要记住的一件事是,在尝试访问之前,请确保您要查找的元素已加载并在 DOM 中可用。

    您可以通过在调用inputt.click() 后让您的代码“休眠”几秒钟来测试这是否确实是错误的原因,具体取决于实际页面在浏览器中加载元素所需的时间.然后你可以决定使用 Selenium 提供的“等待”功能:https://www.selenium.dev/documentation/en/webdriver/waits/

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2021-06-04
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多