QQメールボックスの自動ログインについては、以下を参照してください:Pythonはスライド検証を実装しますログイン
後、要素「writeletter」を見つける必要があります:それはまったく見つけることができず、エラーが報告される可能性のある場所は変更されました。iframeと誤った配置位置の問題ではありません:[NoSuchElementException]
現時点では、ページジャンプを検討する必要があります:python-selenium window switch
ただし、QQメールボックスの状況は異なります。ドメイン名はすべてmail.qq.comですが、ログイン後にいくつかの新しいサブドメインが追加されます。したがって、印刷ウィンドウハンドルは、ログインの前後で同じであることがわかりますが、ドメイン名が変更されたため、エラーが発生します。理由は、ページ要素がロードされていないため、要素を見つけることができないため、明示的に待機することで解決できます。
ログインコードは次のとおりです。
import time
import paramiko
import pyautogui
import os
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Auto_Test.base_action import match
import pyperclip
import random
from Auto_Test.base_action import random_and_write
browser = webdriver.Firefox()
def login_in():
global browser
browser.maximize_window()
browser.get("https://mail.qq.com/")
browser.switch_to.frame("login_frame")
browser.find_element_by_class_name("inputstyle").clear()
browser.find_element_by_class_name("inputstyle").send_keys("3540830376")
browser.find_element_by_class_name("inputstyle.password").clear()
browser.find_element_by_class_name("inputstyle.password").send_keys("LUO808089lin")
browser.find_element_by_id("login_button").click()
browser.find_element_by_class_name("login_button").click()
time.sleep(2)
browser.switch_to.frame("tcaptcha_iframe")
print("~" * 10)
titl = browser.title
print(titl)
now_url = browser.current_url
print(now_url)
print("~" * 10)
time.sleep(3)
# 等待图片加载出来
WebDriverWait(browser, 5, 0.5).until(
EC.presence_of_element_located((By.ID, "tcaptcha_drag_button")))
current_window = browser.current_window_handle # 获取当前窗口handle name
print(current_window,"####")
lx,ly=match("QQmail-slick")
lz=[x for x in range(150,200,3)]
for i in lz:
pyautogui.moveTo(lx,ly)
pyautogui.dragRel(i,0,duration=2,button='left')
time.sleep(1)
pyautogui.moveRel(-i,0)
try:
alert = browser.find_element_by_id('guideText').text
except Exception as e:
print('get alert error: %s' % e)
alert = ''
if alert:
print(u'滑块位移需要调整: %s' % alert)
sleep(3)
else:
print('滑块验证通过')
browser.switch_to.parent_frame() # 验证成功后跳回最外层页面
break
browser.switch_to.default_content()
情報を送信するための機能コード:
def send_message():
global browser
print("切换之前")
print("*"*10)
titl=browser.title
print(titl)
now_url=browser.current_url
print(now_url)
print("*"*10)
time.sleep(3)
current_window = browser.current_window_handle # 获取当前窗口handle name
print(current_window,"&&&&&")
all_window = browser.window_handles
print(all_window,"&&&")
print("*"*18)
browser.switch_to.window(current_window)
print("切换之后")
print("$" * 10)
titl = browser.title
print(titl)
now_url = browser.current_url
print(now_url)
print("$" * 10)
current_window = browser.current_window_handle # 获取当前窗口handle name
print(current_window, "!!!!")
all_window = browser.window_handles
print(all_window, "!!!")
print("*"*18)
main関数にあるのは、ログイン後のページ要素「writeletter」です。
if __name__ == '__main__':
login_in()
WebDriverWait(browser, 15, 0.5).until(
EC.presence_of_element_located((By.ID, "composebtn_td")))
send_message()
操作の結果は次のとおりです。
~~~~~~~~~~
登录QQ邮箱
https://mail.qq.com/
~~~~~~~~~~
18 ####
切换之前
**********
登录QQ邮箱
https://mail.qq.com/
**********
18 &&&&&
['18'] &&&
******************
切换之后
$$$$$$$$$$
QQ邮箱
https://mail.qq.com/cgi-bin/frame_html?sid=1n7EDcWwNTlb5TZW&r=f256c0f155b6b5bf0aecf1bb407bbd7f
$$$$$$$$$$
18 !!!!
['18'] !!!
******************
待機を追加したら、それで十分です。
ジャンプウィンドウのコードを削除しても、結果は同じです。
browser.switch_to.window(current_window)
自分の手術の結果に矛盾がある場合は、交換して話し合い、一緒に学んでください!