python - 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)
解决方案
我会在你的 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()
希望这对您有所帮助。
问候,尤金
推荐阅读
- networking - 设备如何使自己可供外界使用?
- angular - 使用角度从服务器动态获取翻译
- google-sheets - Googl 表格 - 到表格的时间范围
- php - /broadcasting/auth 端点在尝试向 Sanctum 进行身份验证时总是失败并出现 403(拒绝访问)错误
- python - Django 令牌和会话身份验证
- ios - Apple 登录 TVOS 问题 -7014
- ios - 我应该如何为 swift 项目构建我的存储库?
- python - 了解使用不同宽度的高斯进行卷积/反卷积时的行为
- javascript - 在反应原生博览会上,图像未显示在 Android 设备上
- html - 我怎样才能添加有角度的边框或类似这个网站的东西?