I am not using Selenium RC or Remote WebDriver, but When I am trying to run my test , its throwing me error -
remotewebdriver.unpackAndThrowOnError(Response errorResponse)
My script has simple code:
driver.FindElement(By.XPath("xpath");
Error thrown at:
RemoreWebDriver.FindelementByXPath(String XPath);
Please help me resolving the issue
Because of the architecture of WebDriver, all discrete browser-specific drivers (FirefoxDriver, ChromeDriver, etc.), are subclasses of RemoteWebDriver. This means that, in keeping with good Object-oriented programming principles, the error handling code is common to all implementations, and is located in the base class, or RemoteWebDriver. This means that in the stack trace for any error, it’s common, even expected, to see RemoteWebDriver methods in the call stack.
Having said all of this, I suspect that the question you’re really asking is not, “Why do I see RemoteWebDriver in my stack trace when I’m not using remote?” Rather, I suspect the question you’re asking is, “Why is my FindElement call failing?” The answer to that depends on a lot of factors, but the most common is that the element isn’t located by the locator you’re specifying, or that the element isn’t actually in the page’s DOM when you attempt to find it. In the former case, you should fix the locator; in the latter case, you should wait for the element to be present before finding it (usually by using WebDriverWait, or a similar construct).
Of course, without the HTML you’re attempting to automate, and the full WebDriver code you’re attempting to use, more detailed advice is impossible to provide.
Related
I am running a test nightly via Jenkins. About 95% of the time it passes. But occasionally it is failing doing this:
driver.findElement(By.xpath("//div[contains(#id, 'stage')]/div[contains(#class, 'tabMenu')]/span[contains(#class, 'menuItem') and contains(text(),'Employer')]"))
with an org.openqa.selenium.InvalidSelectorException. Note: this almost always works.
So I debug using Eclipse and Java and Selenium. Again, I had to run the test about 30 times before getting this error.
I am using Selenium and IE. IE does not have good debugging so using Eclipse Debug Shell I write the page source to a file, rename the file to an html file and edit with Chrome. In the inspect window I do a search for
//div[contains(#id, 'stage')]/div[contains(#class, 'tabMenu')]/span[contains(#class, 'menuItem') and contains(text(),'Employer')]
and it finds it and highlights it. When I from debug shell do a
driver.findElement(By.xpath("//div[contains(#id, 'stage')]/div[contains(#class, 'tabMenu')]/span[contains(#class, 'menuItem') and contains(text(),'Employer')]"))
I get the
org.openqa.selenium.InvalidSelectorException:Unable to locate an element ... because of the following error:
[object Error] (WARNING: The server did not provide any stacktrace information)
So I thought I would just get all the divs and get their IDs:
driver.findElement(By.xpath("//div"))
and I get
org.openqa.selenium.InvalidSelectorException: Unable to locate an element with the xpath expression //div because of the following error:
[object Error] (WARNING: The server did not provide any stacktrace information)
so OK. I try driver.findElement(By.xpath("//*")) and still get the InvalidSelectorException
so "//*" would have to find elements. And even if it didn't, shouldn't it return something like a NoSuchElementException rathe than an InvalidSelectorException? Anyone know what is happening? I did a search to find the meaning of InvalidSelectorException and found usage but not really a definition.
So I guess I have two questions: 1. why aren't any elements (even "//*") being found, and 2. Shouldn't it be returning NoSuchElementException and not InvalidSelectorExmaple?
The InvalidSelectorException and NoSuchElementException are completely different exceptions.
NoSuchElementException
This is raised when locator strategy used is correct but no element matching it can be found in the page's DOM.
InvalidSelectorException
This is raised when the locator string that is being used is invalid. In the Selenium java implementation there are a couple of examples where this exception should be thrown:
testShouldThrowInvalidSelectorExceptionWhenXPathIsSyntacticallyInvalidInDriverFindElement
testShouldThrowInvalidSelectorExceptionWhenXPathReturnsWrongTypeInDriverFindElement
As you can see this exception is thrown when the xpath is invalid.
Why you may get InvalidSelectorException
You mentioned running your tests on IE, however IE browser doesn't have a native xpath engine for finding elements. So to be able to find elements by xpath in IE, the driver will have to use a JavaScript xpath query engine.
The above I know to be true for IE versions up until including 9. Not sure about IE10 and IE11 but you also don't mention what IE version you're using, so this may be one of the root causes.
Your xpath is syntactically correct however it may not be the case for IE.
What can you try to fix your issue
your already making use of classes and ids so you may as well try to change selector strategy to CSS Selector. At least for the elements that are failing
try updating your xpaths selector to be a bit less complex (if possible)
switch to a more modern browser: Chrome, Firefox, Edge, if possible (however I doubt that anyone is using IE out of pure choice)
NoSuchElementException
NoSuchElementException is the exception thrown by WebDriver.findElement(By by) and WebElement.findElement(By by) methods if no matching elements are found.
NoSuchElementException extends NotFoundException which in turn extends WebDriverException.
It's direct known subclass is InvalidSelectorException
You can find a couple of detailed discussions on
NoSuchElementException in:
NoSuchElementException, Selenium unable to locate element
Exception in thread “main” org.openqa.selenium.NoSuchElementException: Unable to locate element:
//*[#id='login-email']
InvalidSelectorException
InvalidSelectorException is the exception thrown when using the selector no element can be identified and as mentioned earlier is the direct known subclass of NoSuchElementException.
You can find a couple of relevant detailed discussions in:
Invalid selector: Compound class names not permitted error using Selenium
Selenium CSS selector throwing OpenQA.Selenium.InvalidSelectorException - what's
wrong?
Curious case of Internet Explorer
However in a dozen of previous discussions users in favor of css-selectors say that it is more readable and faster especially when running against internet-explorer.
You can find a detailed discussion in Why should I ever use CSS selectors as opposed to XPath for automated testing?
This usecase
This line of code...
driver.findElement(By.xpath("//div[contains(#id, 'stage')]/div[contains(#class, 'tabMenu')]/span[contains(#class, 'menuItem') and contains(text(),'Employer')]"))
...apperantly looks perfect.
However, as per the best practices I would suggest to avoid mixing up contains() and text(). You can use either of them as follows:
Using contains():
driver.findElement(By.xpath("//div[contains(#id, 'stage')]/div[contains(#class, 'tabMenu')]/span[contains(#class, 'menuItem') and contains(.,'Employer')]"))
Using text():
driver.findElement(By.xpath("//div[contains(#id, 'stage')]/div[contains(#class, 'tabMenu')]/span[contains(#class, 'menuItem') and text()='Employer']"))
While I was doing testing in Eclipse, my java program has to wait for the page in Firefox driver to load completely. Is their any way that i can tell my program to continue executing the next step without waiting?
In my professional opinion, you shouldn't do this. You should let Selenium do its duty, and make sure the page is fully loaded before you continue.
One thing to note, is that when you call click() on a WebElement, Selenium doesn't actually wait for the page to load. driver.get() does however.
What you are asking, isn't a very "common practice", so this may or may not work.
Try just setting the pageLoadTimeout "0".
driver.manage().timeouts().pageLoadTimeout(0L, TimeUnit.MILLISECONDS);
(this syntax is of course if you are using Java. you don't have the question marked as a specific language, so take it as it is and convert it to your language of choice)
I have generated the script using Selenium IDE. But not giving me proper output.
ERROR: Caught exception [Error: Dom locators are not implemented yet!]
ERROR: Caught exception [Error: Dom locators are not implemented yet!]
This gets displayed instead of the element code.
I have tried xpath locator. But its not working.
Read the error.
Dom locators are not implemented yet!
That could maybe, I'm not sure, mean, that the DOM locators are not implemented yet and you need to use another locator strategy. Look at all available locator strategies and pick one. The often used ones are id, name, css, xpath, ideally in this order (from weakest to strongest, but also from fastest to slowest).
By the way, Selenium RC has been oficially deprecated two years ago in favor of the new and shiny Selenium WebDriver. If you want to use something that's actually supported and developed, export your scripts to WebDriver.
I am using "org.openqa.selenium.phantomjs.PhantomJsDriver" Java class.
At times, I need to identify whether a given WebElement is a particular type of web element; eg: Is this webelement a input type element or not.
This does not seem to come with PhantomJsDriver package.
"com.gargoylesoftware.htmlunit." package seems to have useful wrappers on top of web elements. I can write code like "element instanceof HtmlInput".
Question here is
- Can I really HTMLunit package with phantomjsdriver ? Am I using two libraries which are not supposed to be used with one-another ?
No. Unfortunately, you can't do this the way you're doing it. PhantomJsDriver is backed by WebKit, while HtmlUnitDriver is backed by HtmlUnit which has its own browser core. Selenium is able to wrap both these (and some more) under one hood, but we can't use them interchangeably.
There are, however, different ways of doing what you're trying to do, the best probably being using Selenium's own methods getTagName() and getAttribute() if needed.
If you ran getTagName() on your input element, it would gladly return "input".
I'm trying to use opera dragonfly for debugging, it seems quite nice, but I'm probably doing things wrong here. First problem comes with the console.log() method:
In my JavaScript code I just put something like console.log(someVariable)
When I look at the error tab I can only see reports like [object MouseEvent] [object] etc.
Most of the time it's completely useless information since I usually already know my variable types. Am I using it wrong? How can I see detailed information about complex variables?
I use console.trace() in my JavaScript code expecting a useful hay stack but nothing happens. When I open up dragonfly console and use the command console.trace(something) it always returns undefined. Quite frustrating since I have dragonfly documentation right in front of me now but most of the console methods seems to do nothing useful for me. I really hope I'm using it wrong.
Does anyone knows how to extract really useful information from Dragonfly?
Opera Dragonfly's console.*() methods are not yet as powerful as Firebug's. They will become more capable over time. As of now, you can not expand the object to discover properties and methods inside the console itself, but you can click an object to have its detail for inspection in the pane for inspecting objects and properties.