一.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类(鼠标操作)
常用于模拟鼠标的行为,比如单击、双击、拖拽等行为
- click(on_element=none) --- 鼠标单击
- double_click(on_element=none) --- 双击
- context_click(on_element=none) --- 右击
- click_and_hold(on_element=none) --- 鼠标单击并且按住不放
- drag_and_drop(source,target) --- 拖拽
- drag_and_drop_by_offset(source,xoffset,yoffset) --- 将目标拖动到指定的位置
- key_down(value,element=none) --- 按下某个键盘上的键
- key_up(value,element=none) --- 松开某个键
- move_by_offset(xoffset,yoffset) --- 鼠标从当前位置移动到某个坐标
- move_to_element(to_element) --- 鼠标移动到某个元素
- move_to_element_with_offset(to_element,xoffset,yoffset) --- 移动到距某个元素(左上角坐标)多少距离的位置
- perform() --- 执行链中的所有动作
- release(on_element=none) --- 在某个元素位置松开鼠标左
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自动登录的资料请关注代码网其它相关文章!
发表评论