想要实现一个后台登录12306的函数,可视化运行时没有问题,但是后台静默运行登录时,滑块元素定位不到,这是为什么呀
可以把你的代码发出来吗?
from selenium import webdriver
import time,requests
from selenium.webdriver.common.action_chains import ActionChains #拖拽
from hashlib import md5
driver = ''#定义全局driver,使函数运行完毕后网页不会自动关闭
def login(id,password):
global driver
url='https://kyfw.12306.cn/otn/resources/login.html'
driver = webdriver.Chrome()
driver.maximize_window()
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
'''option = webdriver.ChromeOptions()
option.add_argument('headless')
driver = webdriver.Chrome(options=option)
'''
# 关闭12306网页对自动登录的检测
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator,'webdriver',{
get: () => undefined
})
"""})
driver.get(url)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()
driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys(id)
driver.find_element_by_xpath('//*[@id="J-password"]').send_keys(password)
print('正在输入账号密码....')
headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
cjyusername='超级鹰账号'
#定义密码的格式
cjypassword='超级鹰密码'
cjypassword=cjypassword.encode('utf8')
cjypassword= md5(cjypassword).hexdigest()
cjyid='919658'
params = {
'codetype': '9004',
'user': cjyusername,
'pass2': cjypassword,
'softid': cjyid,
}
verify_img = driver.find_element_by_xpath('//*[@id="J-loginImg"]')#获取验证码图片
print('正在获取验证码...')
time.sleep(3)
files = {'userfile': ('ccc.jpg', verify_img.screenshot_as_png)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,headers=headers)
responce=r.json()
time.sleep(2)
pre_location = responce['pic_str']
location_list = pre_location.split("|")
for pre_location in location_list: #通过坐标模拟点击
location = pre_location.split(',') #切割坐标
x = int(location[0])
y = int(location[1])
ActionChains(driver).move_to_element_with_offset(verify_img, x, y).click().perform()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="J-login"]').click()
time.sleep(2)
button = driver.find_element_by_xpath('/html/body/div[5]/div[2]/div/div[3]/div/div[1]/div[2]/span')#滑块验证
ActionChains(driver).drag_and_drop_by_offset(button, 340, 0).perform()
print('验证成功,正在登录!')
n=0
url1=0
for i in range(10000): #等待并判断网页的跳转,并更新
time.sleep(0.1)
if(driver.current_url !=url):
driver.refresh()
url1=driver.current_url
n+=1
if(n==2):
driver.refresh()
break
print('登录成功!')
url=driver.current_url
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[7]/div[2]/div[3]/a').click()
hover_element=driver.find_element_by_xpath('//*[@id="J-chepiao"]/a')
ActionChains(driver).move_to_element(hover_element).perform() #移动光标至“车票”
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[1]/div[2]/ul/li[2]/div/div[1]/ul/li[1]/a').click()
for i in range(1000): #第二次判断网页跳转
time.sleep(0.1)
if(driver.current_url !=url):
driver.refresh()
break
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[48]/div[2]/div[2]/div[2]/a').click()
print('正在查询票数...')
login('账号','密码')
程序运行找不到元素有几种情况:
1、 跳页面了,比如打开了新页
2、 页面上有iframe,这个是内嵌页面
要解决这两种情况,你可以在要定位元素的语句打断点调试,调试时在打开的页面上再用F12去看看元素的Xpath,和你写的对照,看是否一致;同时检查是否跳页或页面有Iframe;
如果跳页,则需要:
driver.switch_to.(driver.window_handles[1])
如果有iframe,则需要先定位,再跳到iframe,再定位元素
iframe = driver.find_element_by_xpath('iframe位置')
driver.switch_to.frame(iframe)
time.sleep(2)
# 再定位你的元素
一步步调试运行,定位错误
解决了吗 ,我现在也是这个问题,静默运行的时候窗口是小窗口模式,显示不出元素,无法定位到该按钮。不知道怎么解决