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()
  • 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()
  • 目录
    • 一.python输入点击登录页面
    • 二.若是link方式定位跳转
    • 三.悬停
      • 1.悬停的关键语句及意义
      • 2.悬停相关的其他拓展
      • 3.悬停相关的代码示例
    • 四.获取网页标签及文本
      • 1.获取网页标题
      • 2.重转网页,获取更新标题
      • 3.获取网页标题

    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()

    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()
    

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

    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.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()

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

    #跳转完后,标题更新
     
    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)

    #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自动登录的资料请关注风君子博客其它相关文章!

    您可能感兴趣的文章:

    • python实现自动登录
    • python自动化实现登录获取图片验证码功能
    • Python 实现自动登录+点击+滑动验证功能
    • Python模拟登录和登录跳转的参考示例
    • Python自动化测试之登录脚本的实现
    • Python实现获取网页内容及自动填表单与登录功能

    站内搜索