I am new to Protractor. Can anyone tell me how can we use Actions like mouse over,drag and drop(like Actions in Selenium) in Protractor. I need just a syntax or a code snippet.
It is actually there, inside the Protractor API documentation: .actions():
browser.actions().
mouseDown(element1).
mouseMove(element2).
mouseUp().
perform();
A common problem is to forget calling perform() at the end which may results into it doing nothing. We actually had a weird test that had an action chain without the perform() and, because of the incorrect expectation the test just passed. You can catch these types of problems statically now, with eslint-plugin-protractor (shameless self-promotion).
Related
Something is wrong with the AcceptanceTester->see() method for me. It can't see things that are plainly there in the source, as shown by the AcceptanceTester->seeInSource() method.
Here's my test, which runs in PHPBrowser within the WP-Browser implementation of Codeception:
public function testAfricaIsVisible(AcceptanceTester $I) {
$I->amOnPage('/');
$I->seeResponseCodeIs(200);
$I->seeInSource('Africa');
$I->see('Africa');
}
Here's the result I get:
As you can see, ->SeeInSource("Africa") works, but ->see("Africa") fails.
I understand that ->SeeInSource() sometimes "sees" things that ->see() doesn't, but in this case, the word "Africa" is link text that should be clearly visible with or without strip_tags() applied.
In this case, when I open up the Html link the word "Africa" is clearly visible:
Anyone have any idea why Codeception doesn't ->see() this text?
I figured it out. For anyone with a similar problem, the underlying issue was malformed HTML that was glossed over by Chrome/Firefox but screwed up the site as seen by Phpbrowser. I bet if I was using the WebDriver module instead, it would work.
The solution: Use an HTML validation tool and fix the reported syntax errors.
In this case it was a title tag with a single-quote in it, e.g. title='doesn't'
My app displays an error dialog whenever a JavaScript error occurs. This is always a bad sign, so I want to set up my tests so that, if the error dialog appears, it causes the test to fail there and then.
So I'd like to do something like (very much pseudocode!);
// start a new 'guard' thread;
start {
found = this.driver.wait(untilVisible(By.css('.myErrorDialog')), VERY_LONG_TIMEOUT);
if (found) {
// the error dialog appeared! That's bad!
throw();
}
}
// now run the test
login();
clickButton();
testBannerContains();
But I'm having trouble and I think it has to do with the way Selenium schedules actions.
What I've found is that for a single driver, I can only schedule one thing at a time, so the guard I set up early in the test blocks the body of the test from starting.
Is there a better way to handle conditions like 'this should never happen', or a way to create two independent threads in the same test?
So the problem with the code you have is that it immediately runs it and waits for a VERY_LONG_TIMEOUT amount of time for that error dialog to appear. Since it never does, it continues to wait. You have already discovered that is not what you want... ;)
I haven't done anything like this but I think you want a JS event handler that watches for the event that is triggered when the error dialog appears. See the link below for some guidance there.
Can my WebDriver script catch a event from the webpage?
One option would be to watch for that event to fire and then store true (or whatever) in some JS variable. Before leaving a page, check to see if the variable is set to true and if so, fail the test. You can set and get JS variables using JavascriptExecutor. Some google searches should get you all you need to use it.
The geb documentation shows that it has built in jQuery support. Im interested in one particular method called mouseover. However when I try to use the mouseover function I get a warning saying, "Cannot resolve symbol 'mouseover'". This happens even when I'm using the code in their example. What am I missing?
This might not directly answer your question. But if you are trying to mimic mouse over action in Geb, you could also use
interact {
moveToElement(element)
}
http://www.gebish.org/manual/current/#interact-closures
Every now and then my selenium tests randomly fail with an "element X not found" error message. I do a simple select by ID, eg.
click('sideBar_queryButton')
When I use the dom inspector, the element is there, so I wonder why selenium doesn't find it sometimes. When I run the same test again, it works or it breaks again, there seems to be no reliable way of reproducing it. Even tests which are there for ages seem to randomly break and then magically work again. Inserting a few sleep statements sometimes helps but not reliably. So I wonder if I'm using it incorrectly. Has anyone else had these problems with selenium and if so, how did you fix them?
Edit: I found it to be much more reliable to put some test markers in my pages and wait for them to appear. If you use asynchronous operations which might create race conditions in your tests, inserting a test marker into your html after you finish the operation worked pretty well for me. E.g.
$('<div>').addClass("testMarker").append("OpXYZFinished").appendTo($('#content'));
That way, you can do a simple "waitForTextPresent" to see if things worked out and its much more reliable than guessing the browser's loading state. The testmarker class needs to be formatted in a way that it is not visible to the user (e.g. font color == background color).
Thanks for all your comments. After some deeper digging on the net and
in our tests I finally found combining these statements instead of a
simple waitForPageToLoad to be the cure for our issues:
waitForPageToLoad('')
// wait until all ajax activity has ceased. That check's jQuery's $.active
waitForCondition('selenium.browserbot.getUserWindow().$.active == 0', 5000)
// wait a second for all JS to properly initialize
pause(1000)
There is still a pause in there which is somewhat ugly, but it does
the trick.
I'm trying to capture the screen whenever something goes wrong, either an error or failure
You can use selenium.captureScreenshot() create a util method which you can call whenever you want to capture the screen shot. However if you are using Testng then you can refer http://satishjohn.wordpress.com/2012/06/04/selenium-testng-error-screenshot-listene/ but this is for failedtest passedtest skipped test. however you can put the capturescreen shot as a helper method in you utilities and call it under the testng method.