python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python自动登录

python实现自动登录跳转页面并获取信息

作者:大佬,救命!!!

这篇文章主要为大家详细介绍了如何使用python实现自动登录跳转页面并获取信息功能,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下

一.python输入点击登录页面

from  selenium import   webdriver
from  time import  sleep
dx=webdriver.Chrome()
# dx.get("http://192.168.10.132:8080/cms/")
dx.get("http://192.168.10.132:8080/cms/manage/login.do")
dx.maximize_window()
 
sleep(2)
dx.find_element_by_id("userAccount").send_keys("admin")
sleep(2)
dx.find_element_by_id("loginPwd").send_keys("123456")
sleep(2)
dx.find_element_by_id("loginBtn").click()
 
sleep(10)
dx.quit()

在老版本可以,若是更新到最新的插件和第三方库,报错

''' 报错:
---> 11 dx.find_element_by_id("userAccount").send_keys("admin")
     12 sleep(2)
     13 dx.find_element_by_id("loginPwd").send_keys("123456")
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'
'''
 
 
 
'''解析:
在您的代码中,出现的错误 AttributeError: 'WebDriver' object has no attribute 'find_element_by_id' 是因为您使用的 Selenium 库中,find_element_by_id 方法已经被弃用并在较新的版本中移除。从 Selenium 4 开始,推荐使用新的方法来查找元素。
您可以使用 find_element 方法,并通过 By.ID 来指定使用 ID 查找元素。首先,确保您已经导入了 By 类。
'''

解决方法,使用符合当前最新库的语法,丢弃之前的错误写法

# 登录测试
 
from selenium import webdriver
from selenium.webdriver.common.by import By  # 导入 By 类以使用新的查找元素方法
from time import sleep
 
dx = webdriver.Chrome()
 
dx.get("http://192.168.10.132:8080/cms/manage/login.do")
dx.maximize_window()
sleep(2)
dx.find_element(By.ID, "userAccount").send_keys("admin")
sleep(2)
dx.find_element(By.ID, "loginPwd").send_keys("123456")
sleep(2)
dx.find_element(By.ID, "loginBtn").click()
sleep(10)
dx.quit()

二.若是link方式定位跳转

from selenium import webdriver 
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
dx.find_element_by_link_text("地图").click()

若是版本及库更新到最新,会报错如下:

'''
AttributeError                            Traceback (most recent call last)
<ipython-input-1-081328daae09> in <module>
      5 dx.maximize_window()
      6 sleep(2)
----> 7 dx.find_element_by_link_text("地图").click()
AttributeError: 'WebDriver' object has no attribute 'find_element_by_link_text'
'''
 
'''
在 Selenium 4 中,许多旧的定位元素的方法,如 find_element_by_link_text,已经被弃用并移除。
这是为了统一和简化 API,并鼓励使用更现代的 find_element 方法结合 By 类来定位元素。
为了修复你的代码,你需要使用 By.LINK_TEXT 来代替直接调用 find_element_by_link_text。
'''

此次,放弃之前废弃的语法,重新修改到对应的语法,如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
 
dx = webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
# 使用新的方法查找并点击链接文本为"地图"的元素
dx.find_element(By.LINK_TEXT, "地图").click()
sleep(10)
dx.quit()

三.悬停

1.悬停的关键语句及意义

ActionChains(dx).move_to_element(wz).perform() 

ActionChains(dx).move_to_element(wz).perform() 是 Selenium WebDriver API 中的一个操作链,用于模拟用户将鼠标移动到页面上的特定元素上的行为。下面是对这个操作的详细解析:

ActionChains 类:

ActionChains 是 Selenium 提供的一个类,用于生成一系列的用户交互动作,比如点击、键盘输入、鼠标移动等。

这些动作可以被串联起来,形成一个动作链,然后通过调用 perform() 方法一次性执行。

dx 参数:

dx 在这里代表一个 WebDriver 实例,它是与浏览器交互的接口。

ActionChains 类的构造函数需要传入一个 WebDriver 实例,以便能够控制浏览器执行相应的动作。

move_to_element 方法:

move_to_element(element) 是 ActionChains 类的一个方法,用于将鼠标移动到指定的元素上。

参数 element 是一个 WebElement 对象,代表页面上的一个元素。这个对象通常是通过 WebDriver 的 find_element 或 find_elements 方法找到的。

wz 参数:

wz 在这个上下文中是一个变量,它应该引用了一个 WebElement 对象。

在您的代码中,wz 是通过 dx.find_element_by_name("tj_briicon") 获取的。但是,如之前所述,"tj_briicon" 通常不是百度首页元素的正确 name 属性,因此这行代码可能无法找到正确的元素。

perform 方法:

perform() 是 ActionChains 类的一个方法,用于执行之前添加到动作链中的所有动作。

在调用 perform() 之前,可以添加多个动作到动作链中,然后一次性执行它们。

在这个例子中,动作链中只有一个动作:将鼠标移动到 wz 指定的元素上。

综上所述,ActionChains(dx).move_to_element(wz).perform() 的作用是:

创建一个与 WebDriver 实例 dx 关联的动作链。

将鼠标移动到由 wz 指定的元素上。

执行这个动作链。

但是,由于 wz 可能没有正确引用到页面上的元素(因为使用了错误的定位策略),这个操作可能无法按预期工作。正确的做法是使用正确的定位策略来找到元素,并确保该元素在尝试移动鼠标到其上之前是可见和可交互的。

2.悬停相关的其他拓展

ActionChains类(鼠标操作)

常用于模拟鼠标的行为,比如单击、双击、拖拽等行为

3.悬停相关的代码示例

3.1 示例百度学术

#悬停百度
 
from  selenium import   webdriver
from  time import  sleep
from  selenium.webdriver.common.action_chains import  ActionChains
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
wz=dx.find_element_by_name("tj_briicon")
ActionChains(dx).move_to_element(wz).perform()
sleep(2)
dx.find_element_by_link_text("学术").click()

在新版本中依旧报错

'''报错:
AttributeError                            Traceback (most recent call last)
<ipython-input-1-60c3e6400a39> in <module>
      8 dx.maximize_window()
      9 sleep(2)
---> 10 wz=dx.find_element_by_name("tj_briicon")
     11 ActionChains(dx).move_to_element(wz).perform()
     12 sleep(2)
AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'
'''
 
'''解决:
在较新版本的 Selenium 中,一些旧的元素查找方法,如 find_element_by_name,已经被弃用并最终从库中移除。这就是为什么你在尝试使用 find_element_by_name 方法时遇到了 AttributeError。
为了解决这个问题,你应该使用 find_element 方法结合 By 类来定位元素。By 类提供了多种方式来定位元素,如通过名称、ID、类名、标签名、链接文本等。
首先,你需要从 selenium.webdriver.common.by 导入 By 类。然后,你可以使用 find_element(By.NAME, "value") 的形式来替代 find_element_by_name("value")
'''

更新后最新包和库的更改

#悬停百度学术(新)
 
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By  # 导入 By 类
 
dx = webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
 
# 使用 By.NAME 来替代 find_element_by_name
wz = dx.find_element(By.NAME, "tj_briicon")
ActionChains(dx).move_to_element(wz).perform()
sleep(2)
 
# 注意:'学术' 这个链接文本是否存在于当前页面需要确认,
# 因为百度首页的布局和链接可能会变化。如果链接不存在,这里会抛出错误。
dx.find_element(By.LINK_TEXT, "学术").click()

3.2 示例百度高级搜索

使用悬停

#悬停百度高级搜索
from  selenium import   webdriver
from  time import  sleep
from  selenium.webdriver.common.action_chains import  ActionChains
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
wz=dx.find_element_by_xpath('//*[@id="s-usersetting-top"]')
ActionChains(dx).move_to_element(wz).perform()#悬停
sleep(3)
dx.find_element_by_link_text("高级搜索").click()
#悬停百度高级搜索(新)
 
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By  # 导入 By 类
 
# 创建 WebDriver 实例
dx = webdriver.Chrome()
 
# 加载百度首页
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
 
# 定位到设置图标(注意:XPath 可能会因页面更新而变化)
wz = dx.find_element(By.XPATH, '//*[@id="s-usersetting-top"]')
 
# 执行悬停操作
ActionChains(dx).move_to_element(wz).perform()
sleep(3)
 
# 点击高级搜索链接(注意:这里的链接文本可能会因页面更新而变化)
try:
    dx.find_element(By.LINK_TEXT, "高级搜索").click()
except Exception as e:
    print(f"无法点击高级搜索链接:{e}")
sleep(5)
 
# 关闭浏览器
dx.quit()

不使用悬停,点击跳转

#未悬停直接点击
from  selenium import   webdriver
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
dx.find_element_by_xpath('//*[@id="s-usersetting-top"]').click()
sleep(3)
dx.find_element_by_link_text("高级搜索").click()
#未悬停直接点击(新)
from  selenium import   webdriver
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
dx.find_element(By.XPATH,'//*[@id="s-usersetting-top"]').click()
sleep(3)
dx.find_element(By.LINK_TEXT,"高级搜索").click()

调整完版本后,对异常处理 应考虑优化,具体如下

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from time import sleep
 
dx = webdriver.Chrome()
try:
    dx.get("http://www.baidu.com")
    dx.maximize_window()
    sleep(2)
 
    try:
        dx.find_element(By.XPATH, '//*[@id="s-usersetting-top"]').click()
    except NoSuchElementException:
        print("未找到设置图标元素")
        # 发生异常时退出,避免后续代码执行
        dx.quit()
        raise
    except Exception as e:
        print(f"点击设置图标时发生异常: {e}")
        dx.quit()
        raise
    sleep(3)
    
 
    try:    # 尝试点击高级搜索链接
        dx.find_element(By.LINK_TEXT, "高级搜索").click()
    except NoSuchElementException:
        print("未找到高级搜索链接元素")
    except Exception as e:
        print(f"点击高级搜索链接时发生异常: {e}")
finally:
    # 无论是否发生异常,都确保关闭浏览器
    dx.quit()

四.获取网页标签及文本

1.获取网页标题

#title 获取网页标题
 
from  selenium import   webdriver
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
t=dx.title #百度一下,你就知道
print(t)
 
#如果日志不是预期报错提醒
assert t=="百度一下,你就知道"

2.重转网页,获取更新标题

#跳转完后,标题更新
 
from selenium import  webdriver
from time import sleep
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
dx.get("http://www.jd.com")
dx.maximize_window()
t=dx.title #百度一下,你就知道
print(t)

3.获取网页标题

#title 获取网页标题
 
from  selenium import   webdriver
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://www.baidu.com")
dx.maximize_window()
sleep(2)
wb=dx.find_element_by_xpath('//*[@id="s-usersetting-top"]').text
print(wb)
if wb=="设置":
    print("ok")
else:
    print("no")

更新版本并优化代码

# 打印获取到的文本
 
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
 
dx = webdriver.Chrome()
try:
    # 加载百度首页
    dx.get("http://www.baidu.com")
    dx.maximize_window()
    sleep(2)
    
    # 查找设置图标元素并获取其文本
    wb_element = dx.find_element(By.XPATH, '//*[@id="s-usersetting-top"]')
    wb = wb_element.text
    print(wb)
    if wb == "设置":
        print("ok")
    else:
        print("no")
finally:
    # 确保关闭浏览器
    dx.quit()

以上就是python实现自动登录跳转页面并获取信息的详细内容,更多关于python自动登录的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文