首页 > 解决方案 > What should I do if "except part" is not seen by python?

问题描述

I am trying to make a Whatsapp message sender using selenium. I have a txt file that contains phone numbers I want to send a message to and everything is fine about it but the problem is my internet speed. It is not stable.

from pynput.keyboard import Key,Controller
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import UnexpectedAlertPresentException

with open(r"C:\Users\Resul\Desktop\numbers.txt") as f:
    lines = [line.rstrip('\n') for line in open(r"C:\Users\Resul\Desktop\numbers.txt")]

keyboard = Controller()
class WhatsappBot():

    def __init__(self):
        self.driver = webdriver.Chrome()
        self.process()

    def process(self):
        for i in lines:
            print(i+ " " + "Done!")
            link = 'wa.me/{}'.format(i)
            self.driver.get("https://"+link)
            self.driver.find_element_by_xpath('//*[@id="action-button"]').click()
            time.sleep(3)
            try:
                waiter = WebDriverWait(self.driver,25).until(EC.presence_of_element_located((By.XPATH,'//*[@id="main"]/footer/div[1]/div[2]/div/div[2]')))
                message_box = self.driver.find_element_by_xpath('//*[@id="main"]/footer/div[1]/div[2]/div/div[2]')
                for j in message:
                    message_box.send_keys(j)
                    for l in range(23):
                        keyboard.press(Key.space)
                        keyboard.release(Key.space)
                time.sleep(3)
                send_button = self.driver.find_element_by_xpath('//*[@id="main"]/footer/div[1]/div[3]/button')
                send_button.click()
                time.sleep(8)

            except TimeoutException:
                print("Wait More!")
                time.sleep(10)

            except UnexpectedAlertPresentException:
                self.driver.switch_to.alert().accept()


wpbot = WhatsappBot()

Code is here. Since my internet connection is not stable, sometimes driver gives me alerts that say "You wanna leave?" because the message is not sent and the "except UnexpectedAlertPresentException" doesn't work. Eventhough I have that part, it still gives me that error.

    selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: None
Message: unexpected alert open: {Alert text : }
  (Session info: chrome=75.0.3770.142)
  (Driver info: chromedriver=72.0.3626.69 (3c16f8a135abc0d4da2dff33804db79b849a7c38),platform=Windows NT 6.3.9600 x86_64)

标签: pythonselenium

解决方案


我会在你的 whatsAPP 机器人中稍微改变一下逻辑:

选项 A

考虑到您每次在输入中输入一些键后都会收到UnexpectedAlertError ,我建议您每次调用.send_keys(...)方法时检查警报

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

self.driver = webdriver.Chrome()
self.driver.get("url")

send_button = self.driver.find_element_by_xpath('//[@id="main"]/footer/div[1]/div[3]/button')
send_button.click()

try:
    WebDriverWait(browser, 3).until(EC.alert_is_present(),
                                   'Timed out waiting for PA creation ' +
                                   'confirmation popup to appear.')

    alert = self.driver.switch_to.alert
    alert.accept()
    print("alert accepted")
except TimeoutException:
    print("no alert")
....

总结一下,在每个操作之后:单击或 sendKeys 调用,您正在等待警报并在它出现时接受它。或处理异常并继续执行流程。

====== 选项 B

尝试调试并找出更频繁地抛出异常的代码行。并将您输入的逻辑包装在尝试中并捕获更通用的异常,例如:

  except Exception:

在这个 catch 块中检查是否出现任何警报,如果出现则接受/关闭。

alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()

希望这对您有所帮助。

问候,尤金


推荐阅读