11. action

详解WebDriver Action类与鼠标操作API

场景

由于webdriver是要模拟真实的用户操作,因此webdriver的Action类中提供了很多与操作有关的方法。

下面列举一下Action类的一些主要方法

  • key_down。模拟按键按下
  • key_up。模拟按键弹起
  • click
  • send_keys
  • double_click。鼠标左键双击
  • click_and_hold。鼠标左键点击住不放
  • release。鼠标左键弹起,可以与click_and_hold配合使用
  • move_to_element。把鼠标移动到元素的中心点
  • content_click。鼠标右键点击
  • drag_and_drop。拖拽

代码

from selenium.webdriver.common.action_chains import ActionChains

element = wd.find_element_by_link_text('xxxxx') hov = ActionChains(wd).move_to_element(element) hov.perform() 

讨论

具体的api文档参考这里

转载于:https://www.cnblogs.com/hugh007/p/3862986.html

<think>我们正在讨论Android中的Intent Action,特别是`android.intent.action.MEDIA_UNMOUNTED`。根据引用[2]中提到的其他Action的格式,我们可以推断`MEDIA_UNMOUNTED`的用途。 作用:当外部存储介质(如SD卡)被卸载(unmounted)时,系统会广播这个Intent。这通常发生在用户卸载存储介质(比如通过系统设置卸载SD卡)或者存储介质被意外移除(比如物理拔出)的情况下。 常见问题: 1. 应用程序可能正在使用外部存储上的文件,当存储介质被卸载时,应用程序访问这些文件会导致异常(如FileNotFoundException)。 2. 如果应用程序监听了`MEDIA_UNMOUNTED`广播,那么它需要在存储介质卸载时做出适当的响应,比如停止读写操作,保存状态等。 3. 由于存储介质卸载是一个系统事件,应用程序不能阻止它,只能适应它。 注意:从Android 7.0 (API 24) 开始,系统对广播进行了限制,许多广播(包括`MEDIA_UNMOUNTED`)无法在Manifest中静态注册,除非应用满足特定条件(比如是系统应用)。因此,动态注册接收器可能更可靠。 示例代码:注册广播接收器 ```java private BroadcastReceiver mMediaUnmountReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_MEDIA_UNMOUNTED.equals(intent.getAction())) { // 获取卸载的存储路径,通常通过intent.getData()得到 Uri path = intent.getData(); // 处理存储卸载事件 } } }; // 注册广播接收器 IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); filter.addDataScheme("file"); // 通常数据是file类型的URI registerReceiver(mMediaUnmountReceiver, filter); // 不要忘记在适当的地方(如onDestroy)取消注册 ``` 注意:在Android 4.4及以上,使用`Intent.ACTION_MEDIA_UNMOUNTED`时,需要添加`file`的数据方案(data scheme)。 常见问题处理建议: 1. 在存储介质被卸载时,及时关闭打开的文件流,避免应用崩溃。 2. 检查应用是否有必要在存储介质卸载时保存数据,如果有,应提前保存到内部存储或其他位置。 3. 考虑使用`Environment.getExternalStorageState()`来检查存储介质的状态,避免在存储不可用时进行操作。 相关广播: 除了`MEDIA_UNMOUNTED`,还有几个与存储介质相关的广播: - `Intent.ACTION_MEDIA_MOUNTED`:存储介质已挂载且可访问。 - `Intent.ACTION_MEDIA_EJECT`:用户想要移除存储介质(开始卸载过程)。 - `Intent.ACTION_MEDIA_REMOVED`:存储介质已被移除(物理拔出)。 - `Intent.ACTION_MEDIA_BAD_REMOVAL`:存储介质在没有卸载的情况下被移除(即直接拔出)。 这些广播的监听方式类似,但要注意不同版本Android系统的限制。 注意:在Android 10(API 29)及以上,由于分区存储(Scoped Storage)的引入,应用访问外部存储的方式发生了变化,应遵循新的存储访问规范。 引用说明: 引用[2]中提到了其他Action,如DIAL_ACTION、DELETE_ACTION等,但未直接提及MEDIA_UNMOUNTED。不过,其格式和用法是类似的,都是通过Intent的Action字符串来定义,并通过广播或显式Intent来使用。 因此,我们根据对Android系统的理解和引用[2]的格式推断出上述内容。 生成相关问题: 1. 如何监听Android存储介质的挂载和卸载事件? 2. 在Android 10及以上,监听存储卸载事件有哪些变化? 3. 当SD卡被卸载时,如何避免应用崩溃?</think>### Android `MEDIA_UNMOUNTED` 意图详解 #### 1. **作用与定义** `android.intent.action.MEDIA_UNMOUNTED` 是系统广播的**存储介质卸载事件**,当外部存储设备(如SD卡、USB存储)被安全卸载或强制移除时触发。关键特性: - **广播性质**:系统级全局广播(`Broadcast`),非显式启动的`Activity` - **触发场景**: - 用户主动卸载存储设备(通过系统设置) - 存储设备被物理移除(如拔出SD卡) - 存储介质损坏或文件系统异常 - **数据载体**:通过`Intent.getData()`获取卸载设备的挂载点路径(如 `file:///mnt/sdcard`)[^2] #### 2. **典型使用场景** ```java // 注册广播接收器 IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); filter.addDataScheme("file"); // 必须添加数据协议 registerReceiver(storageReceiver, filter); // 接收器实现 private BroadcastReceiver storageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_MEDIA_UNMOUNTED.equals(intent.getAction())) { Uri storagePath = intent.getData(); // 处理存储卸载逻辑 cleanupCache(storagePath); // 清理相关缓存 stopMediaPlayback(); // 停止媒体播放 } } }; ``` #### 3. **常见问题与解决方案** | **问题类型** | **原因** | **解决方案** | |--------------|----------|--------------| | **文件访问崩溃** | 应用尝试访问已卸载存储中的文件 | 检查存储状态:<br>`Environment.getExternalStorageState(storagePath)` | | **广播接收失败** | Android 8.0+ 限制静态注册 | 改用动态注册:<br>`context.registerReceiver()` | | **数据丢失** | 卸载时未保存写入的数据 | 监听`MEDIA_EJECT`预卸载事件:<br>`Intent.ACTION_MEDIA_EJECT` | | **权限问题** | 未声明`READ_EXTERNAL_STORAGE` | 添加权限:<br>`<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>` | #### 4. **关联事件说明** - **`MEDIA_MOUNTED`**:存储设备挂载成功时触发 - **`MEDIA_EJECT`**:用户请求卸载存储(卸载前的预警) - **`MEDIA_REMOVED`**:存储设备被物理移除(未安全卸载) - **`MEDIA_BAD_REMOVAL`**:存储设备被强制拔出[^2] > **关键区别**:`MEDIA_UNMOUNTED`表示**安全卸载完成**,而`MEDIA_REMOVED`表示**非正常移除**。 #### 5. **开发注意事项** 1. **版本适配**: - Android 4.4+ 需添加数据协议:`filter.addDataScheme("file")` - Android 11+ 需使用[存储访问框架](https://developer.android.com/training/data-storage) (SAF) 2. **资源释放**: ```java @Override protected void onDestroy() { unregisterReceiver(storageReceiver); // 避免内存泄漏 super.onDestroy(); } ``` 3. **状态检测**:操作前验证存储状态 ```java String state = Environment.getExternalStorageState(storagePath); if (Environment.MEDIA_MOUNTED.equals(state)) { // 安全访问存储 } ``` --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值