개발하자

파이썬 셀레늄 충돌

Cuire 2023. 2. 25. 14:59
반응형

파이썬 셀레늄 충돌

나는 파이썬 3.9.6 64비트로 정보를 찾기 위해 "셀레늄"을 사용한다.때로는 올바른 결과를 출력하기도 하지만, 10가지 작업 중 몇 가지 작업을 마친 후 갑자기 충돌합니다. 하지만 가끔은 전혀 효과가 없어요.코드는 다음과 같습니다:

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time

web = Chrome()
web.get("http://lagou.com")

web.find_element(By.XPATH, '//*[@id="cboxClose"]').click()

time.sleep(1)

web.find_element(By.XPATH, '//*[@id="search_input"]').send_keys("python", Keys.ENTER)

for i in range(1, 11):
    web.find_element(By.XPATH, f'//*[@id="jobList"]/div[1]/div[{i}]/div[1]/div[1]/div[1]/a').click()

    web.switch_to.window(web.window_handles[-1])

    details = web.find_element(By.XPATH, '//*[@id="job_detail"]/dd[2]/div').text
    print(details)

    web.close()
    web.switch_to.window(web.window_handles[0])

그리고 크라크 정보는 이렇습니다

File "/Users/xxxx/Library/Mobile Documents/com~apple~CloudDocs/xxxx/Code/Python/Project/selenium(2).py", line 20, in <module>
    details = web.find_element(By.XPATH, '//*[@id="job_detail"]/dd[2]/div').text
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 1244, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 424, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="job_detail"]/dd[2]/div"}
  (Session info: chrome=97.0.4692.71)
Stacktrace:
0   chromedriver                        0x000000010fa0fe69 chromedriver + 5160553
1   chromedriver                        0x000000010f99a593 chromedriver + 4679059
2   chromedriver                        0x000000010f54e2c8 chromedriver + 172744
3   chromedriver                        0x000000010f583b62 chromedriver + 392034
4   chromedriver                        0x000000010f583d21 chromedriver + 392481
5   chromedriver                        0x000000010f5b6304 chromedriver + 598788
6   chromedriver                        0x000000010f5a13fd chromedriver + 513021
7   chromedriver                        0x000000010f5b40ab chromedriver + 589995
8   chromedriver                        0x000000010f5a1623 chromedriver + 513571
9   chromedriver                        0x000000010f576dce chromedriver + 339406
10  chromedriver                        0x000000010f578105 chromedriver + 344325
11  chromedriver                        0x000000010f9cb23e chromedriver + 4878910
12  chromedriver                        0x000000010f9e2d17 chromedriver + 4975895
13  chromedriver                        0x000000010f9e8a3f chromedriver + 4999743
14  chromedriver                        0x000000010f9e361a chromedriver + 4978202
15  chromedriver                        0x000000010f9bfbb1 chromedriver + 4832177
16  chromedriver                        0x000000010f9fffd8 chromedriver + 5095384
17  chromedriver                        0x000000010fa00161 chromedriver + 5095777
18  chromedriver                        0x000000010fa172a8 chromedriver + 5190312
19  libsystem_pthread.dylib             0x00007fff204ab8fc _pthread_start + 224
20  libsystem_pthread.dylib             0x00007fff204a7443 thread_start + 15

어떻게 됐어요?




트릭은 주문 사이에 wait 메서드를 사용하여 페이지가 완전히 로드될 수 있도록 하고 암시적으로_wait :)을 사용하는 것입니다

time.sleep(5) driver.sleep_wait(5)




나는 당신의 코드를 여러 번 실행했고 무작위 반복 후에 충돌한다. 그리고 그것은 일부 소프트웨어가 실행을 완료하지 않았다는 것을 나타낸다. 또한, 내 주행 중 하나는 10번의 반복을 모두 마쳤습니다. 제 이론을 뒷받침하는군요.

그래서 해결책은 이것을 추가하는 것이다

time.sleep(3)

루프의 끝에. 또는 링크로 이동하기 전에 이 줄을 추가하면 나중에 업데이트할 때 더 좋습니다.

web.implicitly_wait(10)

당신은 이것에 대해 더 읽을 수 있습니다




나는 스크립트를 안정적으로 만들기 위해 파이썬 프레임워크를 사용했다: 다음을 사용하여 다음 테스트를 실행합니다:

from seleniumbase import BaseCase

class MyTestClass(BaseCase):
    def test_base(self):
        self.open("http://lagou.com")
        self.click("#cboxClose")
        self.type("#search_input", "python\n")
        for i in range(1, 11):
            self.click('#jobList > div > div:nth-of-type(%s) a' % i)
            details = self.get_text("#job_detail > dd:nth-of-type(2) > div")
            print(details)
            self.driver.close()
            self.switch_to_window(0)

또한 웹 사이트가 중국어로 되어 있기 때문에 다음과 같은 중국어 번역 스크립트를 사용할 수 있습니다:

from seleniumbase.translate.chinese import 硒测试用例

class MyTestClass(硒测试用例):
    def test_base(self):
        self.开启("http://lagou.com")
        self.单击("#cboxClose")
        self.输入文本("#search_input", "python\n")
        for i in range(1, 11):
            self.单击('#jobList > div > div:nth-of-type(%s) a' % i)
            details = self.获取文本("#job_detail > dd:nth-of-type(2) > div")
            print(details)
            self.driver.close()
            self.切换到窗口(0)

두 파일이 동일하게 안정적으로 실행됩니다.


반응형