python后台运行时为什么定位不到元素?

img

想要实现一个后台登录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)
# 再定位你的元素

一步步调试运行,定位错误

解决了吗 ,我现在也是这个问题,静默运行的时候窗口是小窗口模式,显示不出元素,无法定位到该按钮。不知道怎么解决