这就是我对动画按钮的意思。我让它有一个ID,但排毒不能以某种方式找到它
Detox通过自动将测试与应用程序同步来消除瑕疵。如果应用程序繁忙,则测试无法继续到下一行。只有当应用程序空闲时,测试才会恢复。 Detox会非常密切地监控您的应用程序,以便了解它何时处于空闲状态。它跟踪几个异步操作并等待它们完成。这包括:
跟踪当前正在进行中的所有网络请求,并等待它们完成 跟踪待处理的动画并等待它们完成 跟踪计时器(如setTimeout)并等待它们到期 跟踪携带异步消息的React Native网桥 跟踪异步React Native布局和影子队列 跟踪可能包含挂起的异步操作的JavaScript事件循环
显然有一条线说跟踪待定动画,所以如果按钮保持这样的动画效果。那它会继续等待吗?
因此,通常如何妥善处理这个问题?
由于
答案 0 :(得分:6)
来自排毒文件:
无尽的循环动画
默认情况下,Detox将等到动画完成。如果你有 无限循环动画,这可能会导致Detox挂起。在这种情况下, 考虑关闭动画同步或删除 使用react-native-repackager进行E2E构建的无限循环。
https://github.com/wix/detox/blob/master/docs/Troubleshooting.Synchronization.md
一般性评论
无限动画(循环动画)可以让排毒等待永远。 请考虑关闭循环动画进行测试。它也是一个 加快测试所有动画的良好做法。
https://github.com/wix/detox/blob/master/docs/More.AndroidSupportStatus.md
Detox提供disableSynchronization()
- 因此您可以暂时禁用同步以解决动画问题
然后在动画消失后再打开它。然而,这并不适用于所有情况。例如,如果您使用react-navigation并且按下按钮将新屏幕推送到导航堆栈,则该按钮仍将继续在后台设置动画,阻止您计划在新屏幕上运行的任何进一步测试。 / p>
理想情况下,您希望使用其他建议,并为您的E2E测试禁用这些类型的动画。以下是实现此目的的3种可能选择。
答强>
排毒作者建议使用react-native-repackager。目前它只支持RN 0.51,所以这对每个人来说可能并不理想。请在使用前检查支持的版本。
目前仅支持RN 0.51
<强> B:强>
设置React Native构建环境。根据环境配置变量,您可以在构建E2E测试时禁用连续动画。
<强> C:强>
我找到的最简单的方法是使用react-native-config。以下是使用react-native-config的Managing Configuration in React Native上的一篇好文章,以及另一个相关问题how-to-tell-detox-is-running-tests。
安装包:
$ yarn add react-native-config
链接库:
$ react-native link react-native-config
为了测试此解决方案,我在根React Native应用程序目录中创建了2个文件.env.production
和.env.testing
。然后我使用 IS_ANIMATE 配置变量来根据构建环境切换动画。您需要将ENVFILE=.env.testing
和ENVFILE=.env.production
添加到排毒构建配置中。
<强> .env.production 强>
ENV_TYPE=Production
IS_ANIMATE=1
<强> .env.testing 强>
ENV_TYPE=Testing
IS_ANIMATE=0
<强> app.js 强>
import Config from 'react-native-config'
import React, { Component } from 'react'
import {
AppRegistry,
StyleSheet,
Alert,
Animated,
View,
TouchableOpacity,
Text
} from 'react-native'
class example extends Component {
constructor(props) {
super(props)
this.state = {
radius: new Animated.Value(1)
}
}
componentDidMount() {
// only enable animation for production
if (Config.IS_ANIMATE == true) {
this.cycleAnimation()
}
}
cycleAnimation() {
Animated.loop(
Animated.sequence([
Animated.timing(this.state.radius, {
toValue: 2,
duration: 500,
delay: 1000
}),
Animated.timing(this.state.radius, {
toValue: 1,
duration: 500
})
])
).start()
}
render() {
return (
<View testID='container' style={styles.container}>
<Text>{Config.ENV_TYPE}</Text>
<TouchableOpacity
testID='button'
onPress={() => Alert.alert("I was pressed")}
>
<Animated.View
style={[
styles.button,
{transform: [
{scale: this.state.radius},
]}
]}
>
<Text>START DIARY</Text>
</Animated.View>
</TouchableOpacity>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
button: {
justifyContent: 'center',
alignItems: 'center',
borderRadius: 60,
width: 120,
height: 120,
backgroundColor: 'green'
},
text: {
padding: 5,
fontSize: 14
}
})
AppRegistry.registerComponent('example', () => example)
<强> example.spec.js 强>
it('Animated Button', async () => {
const buttonElement = element(by.id('button'));
await expect(buttonElement).toBeVisible();
await buttonElement.tap();
});
<强>的package.json 强>
"detox": {
"specs": "e2e",
"configurations": {
"ios.sim.release": {
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
"build": "ENVFILE=.env.production export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project ios/example.xcodeproj -scheme example -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone 5s, iOS 10.3"
},
"ios.sim.test": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
"build": "ENVFILE=.env.testing xcodebuild -project ios/example.xcodeproj -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build -arch x86_64",
"type": "ios.simulator",
"name": "iPhone 5s, iOS 10.3"
}
}
}
发布版本将挂起:detox build --configuration ios.sim.release && detox test --configuration ios.sim.release
测试版本将通过:detox build --configuration ios.sim.test && detox test --configuration ios.sim.test
答案 1 :(得分:0)
您可以通过使用来解决这个无限动画循环
await device.disableSynchronization();
在与动画元素交互之前放置这一行 然后你可以再次启用同步
await device.enableSynchronization();
此功能之前有一个错误,他们刚刚在此版本中修复了它:18.18.0