mirror of
https://github.com/Priyanshu-hawk/ChatGPT-unofficial-api-selenium.git
synced 2026-06-02 06:03:34 +02:00
94 lines
4.1 KiB
Plaintext
94 lines
4.1 KiB
Plaintext
any type of stractrace error like :
|
|
Stacktrace:
|
|
GetHandleVerifier [0x0104EC13+23731]
|
|
(No symbol) [0x00FD4FD0]
|
|
BaseThreadInitThunk [0x772BFCC9+25]
|
|
RtlGetAppContainerNamedObjectPath [0x7748806E+238]
|
|
|
|
Shows that the synchronous code, at that specific moment, can't find the element, so it's failing
|
|
Solution : Delay the timer a more, or check if the x-path is correct, or check the browser - if any overlayfrom the chatgpt is there or not, or the chrome / chatgpt has went to power saving mode so we need to focus to the tab
|
|
|
|
needs to add error fixes and retry to the query...
|
|
|
|
|
|
-------------
|
|
|
|
# 4. Wait for response to appear and complete
|
|
print("Step 4: Waiting for response...")
|
|
try:
|
|
# First, wait for initial response
|
|
response_container_xpath = "//div[contains(@class, 'markdown prose w-full break-words')]"
|
|
initial_response = WebDriverWait(driver, 30).until(
|
|
EC.presence_of_element_located((By.XPATH, response_container_xpath))
|
|
)
|
|
|
|
print("✓ Initial response detected")
|
|
|
|
# Function to check if response is complete
|
|
def is_response_complete():
|
|
try:
|
|
# Method 1: Check if the send button is enabled again
|
|
send_button = driver.find_element(By.XPATH, "//*[@data-testid='send-button']")
|
|
if send_button.is_enabled():
|
|
return True
|
|
|
|
# Method 2: Check for the presence of typing indicators
|
|
typing_indicators = driver.find_elements(By.XPATH, "//div[contains(@class, 'result-streaming')]")
|
|
if not typing_indicators:
|
|
return True
|
|
|
|
# Method 3: Check if the response text has stopped changing
|
|
current_response = driver.find_elements(By.XPATH, response_container_xpath)[-1].text
|
|
time.sleep(2) # Brief wait
|
|
new_response = driver.find_elements(By.XPATH, response_container_xpath)[-1].text
|
|
return current_response == new_response and current_response != ""
|
|
|
|
except Exception as e:
|
|
return False
|
|
|
|
# Wait for response completion with timeout
|
|
start_time = time.time()
|
|
timeout = 180 # 3 minutes timeout
|
|
last_length = 0
|
|
|
|
while time.time() - start_time < timeout:
|
|
try:
|
|
# Get current response
|
|
responses = driver.find_elements(By.XPATH, response_container_xpath)
|
|
if responses:
|
|
current_text = responses[-1].text
|
|
current_length = len(current_text)
|
|
|
|
# If text length hasn't changed for 5 seconds and response seems complete
|
|
if current_length > 0 and current_length == last_length and is_response_complete():
|
|
time.sleep(5) # Final verification wait
|
|
if current_length == len(responses[-1].text):
|
|
break
|
|
|
|
last_length = current_length
|
|
|
|
|
|
except Exception as e:
|
|
print(f"Warning: Error while checking response: {str(e)}")
|
|
|
|
time.sleep(1) # Prevent excessive CPU usage
|
|
|
|
print("✓ Response completion confirmed")
|
|
|
|
# else: # Timeout occurred
|
|
# raise TimeoutException("Response generation timed out")
|
|
|
|
except TimeoutException as te:
|
|
print(f"Timeout while waiting for response: {str(te)}")
|
|
raise
|
|
except Exception as e:
|
|
print(f"❌ Error in Step 4 (Response Detection): {str(e)}")
|
|
raise
|
|
|
|
|
|
|
|
# Short wait for UI to stabilize
|
|
time.sleep(2)
|
|
|
|
-------------------------------------
|