故事:
在StackOverflow上,我看到用户报告他们无法通过selenium WebDriver"click"命令单击一个元素,并且可以通过执行脚本单击JavaScript来解决它.
Python中的示例:
element = driver.find_element_by_id("myid")
driver.execute_script("arguments[0].click();", element)
Run Code Online (Sandbox Code Playgroud)
WebDriverJS/Protractor中的示例:
var elm = $("#myid");
browser.executeScript("arguments[0].click();", elm.getWebElement());
Run Code Online (Sandbox Code Playgroud)
问题:
为什么在常规WebDriver点击时没有点击"通过JavaScript"?究竟是什么时候发生这种变通方法的缺点(如果有的话)?
我个人使用这种解决方法而没有完全理解为什么我必须这样做以及它可能导致什么问题.
我想点击一个单选按钮,出现在网页上.代码如下:
HTML代码:
<div class="small-checkbox red-theme raleway-regular text-muted2 position-relative">
<div class="city-checkbox inline-block position-relative" ng-class="{'rounded-checkbox': main.current_city_id == 1, 'mb-20': main.ifDeviceIsPhone}">
<label class="mdl-radio mdl-js-radio mdl-js-ripple-effect mh-20" for="mumbaiCity" ng-class="{'is-checked' : main.current_city_id == 1}">
<input type="radio" id="mumbaiCity" class="mdl-radio__button position-relative vertical-middle" name="city" value="1" ng-click="main.setCity('Mumbai', 1)">
<span class="mdl-radio__label position-relative font15"><img class="city-icon" src="../../../assets/img/cities/mumbai-icon.png">Mumbai</span>
</label>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
Tesstcase:
// demo-test.js
describe('Protractor Demo App', function() {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000000;
it('check item count', function() {
browser.get('<link>');
element(by.id('mumbaiCity')).click();
});
});
Run Code Online (Sandbox Code Playgroud)
此测试通过错误:
1)量角器演示App检查项目计数
信息:
失败:元素不可见
我也尝试过:
element(by.css('[ng-click="main.setCity('Mumbai', 1)"]')).click();
Run Code Online (Sandbox Code Playgroud)
它给出了错误:
[16:16:26] E/launcher - 错误:SyntaxError:missing)参数列表后面 …
我真的不明白$和$$命令的用途.我认为它们只是'by.css'的替代品,但为什么是$$?
<element id = "eId"></element>
Run Code Online (Sandbox Code Playgroud)
我想,鉴于上述情况,这些将是相同的:
element(by.css('#eId'));
Run Code Online (Sandbox Code Playgroud)
和
element($('#eId'));
Run Code Online (Sandbox Code Playgroud)
但是,第一个工作,第二个不工作.为什么,这三者有什么区别?
该文档是帮助不大.它们似乎暗示"$"仅用于链接,例如element(by.css('#eId')).element($('#childId'));或"选择第一个元素,然后在第一个元素中选择第二个元素." 但是,我已经看到使用$来选择第一个元素的示例.
无论如何,这有很多文字"三者之间有什么区别(by.css,$和$$)?"
任何人都可以建议我如何在执行量角器测试时禁用角度js应用程序中的动画.我在我的量角器配置文件中添加了以下代码,但这对我没有帮助:
var disableNgAnimate = function() {
angular.module('disableNgAnimate', []).run(function($animate) {
$animate.enabled(false);
});
};
browser.addMockModule('disableNgAnimate', disableNgAnimate);
Run Code Online (Sandbox Code Playgroud) 问题:
在我们的一个测试中,我们有一个"长按"/"点击并保持"功能,我们通过使用以下方法解决:
browser.actions().mouseDown(element).perform();
browser.sleep(5000);
browser.actions().mouseUp(element).perform();
Run Code Online (Sandbox Code Playgroud)
我们希望通过拥有sleep()动作链的一部分来理想地在一行中解决:
browser.actions().mouseDown(element).sleep(5000).mouseUp(element).perform();
Run Code Online (Sandbox Code Playgroud)
显然,这不起作用,因为没有"睡眠"动作.
另一个实际例子可能是"类似人类的打字".例如:
browser.actions().mouseMove(element).click()
.sendKeys("t").sleep(50) // we should randomize the delays, strictly speaking
.sendKeys("e").sleep(10)
.sendKeys("s").sleep(20)
.sendKeys("t")
.perform();
Run Code Online (Sandbox Code Playgroud)
请注意,这些只是示例,问题是通用的.
问题:
是否可以扩展browser.actions()操作序列并引入自定义操作?
我使用Protractor软件进行端到端测试.一些元素正在使用ng-show进行设置.
有人能告诉我如何用Protractor检查这些元素是否可见?
在之前的问题中,我已经看到等待url更改的好方法是使用:
browser.wait( function() {
return browser.getCurrentUrl().then(function(url) {
return /myURL/.test(url);
});
}, 10000, "url has not changed");`
Run Code Online (Sandbox Code Playgroud)
但我试图有一个方法,我可以将myURL作为变量传递(如果我需要将其与其他网站一起使用)并且无法正常工作.
我在我的Page Object文件中尝试这个:
this.waitUrl = function(myUrl) {
browser.wait( function(myUrl) {
return browser.getCurrentUrl().then(function(url, myUrl) {
return myUrl.test(url);
});
}, 10000, "url has not changed");
};
Run Code Online (Sandbox Code Playgroud)
如果这是可能的任何想法,如果这样做怎么办?
在量角器中运行多个测试时遇到问题:60010秒后等待异步脚本结果超时在登录脚本之后执行的教程脚本代码: 
这里我在我的配置文件中使用的代码在另一个问题中提出的A代码,但它没有解决我的问题!
onPrepare: function() {
return browser.getProcessedConfig().then(function(config) {
var browserName = config.capabilities.browserName;
browser.manage().timeouts().setScriptTimeout(60000);
});
Run Code Online (Sandbox Code Playgroud)
PS:即使我为元素放置了错误的位置,我也有超时错误,而且找不到这个元素!好像那行代码"点击进入教程按钮"永远不会被执行
</div></md-card-content> </md-card><!-- end ngIf: !expandChart --> </div> </div> </div></md-content> </div></div> <!-- Google Analytics: change UA-XXXXX-X to be your site's ID --> <!--<script>--> <!--!function(A,n,g,u,l,a,r){A.GoogleAnalyticsObject=l,A[l]=A[l]||function(){--> <!--(A[l].q=A[l].q||[]).push(arguments)},A[l].l=+new Date,a=n.createElement(g),--> <!--r=n.getElementsByTagName(g)[0],a.src=u,r.parentNode.insertBefore(a,r)--> <!--}(window,document,'script','https://www.google-analytics.com/analytics.js','ga');--> <!--ga('create', 'UA-XXXXX-X');--> <!--ga('send', 'pageview');--> <!--</script>--> <script src="scripts/vendor.js"></script> <script src="cordova.js"></script> <script src="scripts/scripts.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> <div class="introjs-overlay" style="top: 0;bottom: 0; left: 0;right: 0;position: fixed;opacity: 0.8;"></div><div class="introjs-helperLayer " style="width: 538px; height:366px; top:64px;left: 195px;"></div><div …Run Code Online (Sandbox Code Playgroud) protractor ×8
javascript ×5
angularjs ×4
selenium ×4
testing ×2
ajax ×1
appium ×1
asynchronous ×1
automation ×1
end-to-end ×1
jasmine ×1
python ×1