selenium模拟登陆问题

问题遇到的现象和发生背景

练习selenium模拟登陆淘宝

问题相关代码,请勿粘贴截图

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
#通过制定chromedriver的路径来实例化driver对象,chromedriver放在当前目录
driver = webdriver.Chrome()
#控制浏览器访问url地址
driver.get("https://www.taobao.com/")
#元素定位
#搜索关键字

#driver.find_element(by=By.ID, value='kw').send_keys('python+selenium')
#点击登录
driver.find_element(by=By.XPATH,value='/html/body/div[3]/div[2]/div[2]/div[2]/div[5]/div/div[2]/div[1]/a[1]').click()
time.sleep(6)
driver.find_element(by=By.ID, value='fm-login-id').send_keys('1')
driver.find_element(by=By.ID, value='fm-login-password').send_keys('1')
driver.find_element(by=By.XPATH,value='/html/body/div/div[2]/div[3]/div/div/div/div[2]/div/form/div[4]/button').click()
time.sleep(6)
#退出浏览器
#driver.quit()

运行结果及报错内容

img

我的解答思路和尝试过的方法

网上百度说要转换框架,可这里没有框架,

觉得是定位问题

我想要达到的结果

正常定位输入不会报错正常登录

原因是你的浏览器打开了新窗口,driver还是指向未登录页面那个窗口,加了两句代码就正常了

#获取当前浏览器的所有窗口句柄
handles = driver.window_handles
#切换到最新打开的窗口
driver.switch_to.window(handles[-1])

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
#通过制定chromedriver的路径来实例化driver对象,chromedriver放在当前目录
driver = webdriver.Chrome()
#控制浏览器访问url地址
driver.get("https://www.taobao.com/")
#元素定位
#搜索关键字
 
#driver.find_element(by=By.ID, value='kw').send_keys('python+selenium')
#点击登录
driver.find_element(by=By.XPATH,value='/html/body/div[3]/div[2]/div[2]/div[2]/div[5]/div/div[2]/div[1]/a[1]').click()
time.sleep(6)

#获取当前浏览器的所有窗口句柄
handles = driver.window_handles
#切换到最新打开的窗口
driver.switch_to.window(handles[-1])

driver.find_element(by=By.ID, value='fm-login-id').send_keys('1')
driver.find_element(by=By.ID, value='fm-login-password').send_keys('1')
driver.find_element(by=By.XPATH,value='/html/body/div/div[2]/div[3]/div/div/div/div[2]/div/form/div[4]/button').click()
time.sleep(6)
#退出浏览器
#driver.quit()


import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)
# 控制浏览器访问url地址
driver.get("https://www.taobao.com/")
# 隐式等待
driver.implicitly_wait(1)
account = 'admin'  # 账号
password = '123456'  # 密码
# 找到“登录”位置
driver.find_element(by=By.CSS_SELECTOR, value="div.member-ft > div > a.btn-login").click()
driver.maximize_window()
time.sleep(2)

# 切换页面 获取当前页面handle 获取所有页面的handle 列表的后面
driver.switch_to.window(driver.window_handles[1])

# 找到“账号名”输入框
el_account = driver.find_element(by=By.CSS_SELECTOR, value='#fm-login-id')
print(el_account.text)
time.sleep(1)
el_account.click()
el_account.send_keys(account)
time.sleep(3)

# 找到“密码”输入框
el_password = driver.find_element(by=By.XPATH, value='//*[@id="fm-login-password"]')
# print(el_password.text)
# print(el_password.location)
el_password.click()
el_password.send_keys(password)
time.sleep(2)

# 找到“登录”按钮,并点击
el_login_btn = driver.find_element(by=By.XPATH, value='//*[@id="login-form"]/div[4]/button')
el_login_btn.click()
# print(el_login_btn.location)
time.sleep(2)

# 切换frame
driver.switch_to.frame('baxia-dialog-content')
# 找到滑块,获取宽高
el1 = driver.find_element(by=By.XPATH, value='//*[@id="nc_1_n1z"]')
print(el1.size['width'])
print(el1.size['height'])

# 找到拖动区域,获得宽高
el2 = driver.find_element(by=By.XPATH, value='//*[@id="nc_1__scale_text"]')
print(el2.size['width'])
print(el2.size['height'])
time.sleep(2)
# 创建一个事件链对象
chains = ActionChains(driver)
# 实现滑块拖动
chains.drag_and_drop_by_offset(el1, el2.size['width'], -el2.size['height'])
# 事件提交
chains.perform()
driver.close()
# 退出浏览器
# driver.quit()

浏览器打开新的页面要切换句柄,不然定位不到新页面的所有的元素:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 通过制定chromedriver的路径来实例化driver对象,chromedriver放在当前目录
driver = webdriver.Chrome()
# 控制浏览器访问url地址
driver.get("https://www.taobao.com/")
# 元素定位
# 搜索关键字

# driver.find_element(by=By.ID, value='kw').send_keys('python+selenium')
# 点击登录
driver.find_element(by=By.XPATH, value='/html/body/div[3]/div[2]/div[2]/div[2]/div[5]/div/div[2]/div[1]/a[1]').click()
time.sleep(6)
#获取当前浏览器的所有窗口句柄
handles = driver.window_handles
#切换到最新打开的窗口
driver.switch_to.window(handles[-1])

driver.find_element(by=By.ID, value='fm-login-id').send_keys('1')
driver.find_element(by=By.ID, value='fm-login-password').send_keys('1')
driver.find_element(by=By.XPATH, value='/html/body/div/div[2]/div[3]/div/div/div/div[2]/div/form/div[4]/button').click()
time.sleep(6)
# 退出浏览器
# driver.quit()


no such element

很简单没有切换句柄

img

只需在你的休眠6秒后添加这个语句即可

获取已经打开的所有句柄

all_windows = driver.window_handles

通过语句指向打开的第二个窗口,从0开始

driver.switch_to.window(all_windows[1])

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 通过制定chromedriver的路径来实例化driver对象,chromedriver放在当前目录
driver = webdriver.Chrome()
# 控制浏览器访问url地址
driver.get("https://www.taobao.com/")
# 元素定位
# 搜索关键字

# driver.find_element(by=By.ID, value='kw').send_keys('python+selenium')
# 点击登录
driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/div[5]/div/div[2]/div[1]/a[1]').click()
time.sleep(6)
# 获取已经打开的所有句柄
all_windows = driver.window_handles
# 通过语句指向打开的第二个窗口,从0开始
driver.switch_to.window(all_windows[1])
driver.find_element(by=By.ID, value='fm-login-id').send_keys('1')
driver.find_element(by=By.ID, value='fm-login-password').send_keys('1')
driver.find_element(by=By.XPATH, value='/html/body/div/div[2]/div[3]/div/div/div/div[2]/div/form/div[4]/button').click()
time.sleep(6)
# 退出浏览器
# driver.quit()


我是新手小白,谢谢大家