java - Selenium FirefoxDriver clicks on wrong link when animations occur -
i using selenium 2.35 , having unpredictable error while trying click on element in firefox this:
new actions(driver).movetoelement(element).click().perform(); the element i've located < span > element click event tied it. issue running when firefox tries click on element misses , clicks on entirely different element. if walk through code using debugger issue never occurs leads me believe firefoxdriver clicking on wrong location on browser, having timing issue. there dynamically loaded < div >'s on page make element want click shift down before locate , send .click() command. believe source of issue. can put thread.sleep(500) ensure has enough time finish animating , inserting dynamic divs, seems sloppy me. there way can tell firefoxdriver wait until elements on screen done shifting around before tries send .click() event?
also, have tried send element.click() seems fail more often.
update (9/5/13):
the solution came of @mrti 's comment following:
private void jsclickonelementbyid(string id) { webelement element = wait.until(expectedconditions.presenceofelementlocated(by.id(id))); javascriptexecutor js = (javascriptexecutor)driver; stringbuilder sb = new stringbuilder(); sb.append("var x = $('#" + id + "');"); sb.append("x.click();"); js.executescript(sb.tostring()); } just ensure element on page added initial "wait" call, , use javascriptexecutor run jquery , click on element on page. seems work great case. if has drawbacks solution appreciated i'm new javascriptexecutor class.
i believe happening dynamic loading making selector select else. if post html, (especially before/after dynamic loading) immensely helpful in writing better selector.
however, there couple of ways wait until loading finished.
the first wait until (boolean)((javascriptexecutor)driver).executescript("return jquery.active == 0") returns true. waits jquery on page finish (which causing dynamic loading). useful, recomment waiting else.
the second option wait until element dynamically loaded present:
wait.until(expectedconditions.presenceofelementselectedby(...selector...)); i method, wait long need wait, , no longer.
the final option write selector select element, if other stuff going on. may best option, may run staleelementreferenceexceptions.
Comments
Post a Comment