Selenium Gotchas¶
Selenium has a few quirks which have caused us immense amounts of debugging time. If you are facing strange issues with Selenium that you can’t explain and this usually boils down to “Selenium is lying to me”, please check this page first before spending vast amounts of time debugging .
Selenium is not clicking on the element it says it is¶
Sometimes, under certain circumstances, Selenium doesn’t click on the element you tell it to.
The symptoms of this include having a WebElement that gives a certain value when queried with
.text()
and then Selenium actually clicking on the wrong element. This has been observed
happening when there is a frame or some other element where horizontal scrolling has been
introduced. A typical example would be in the left hand tree items in the System Image Type
under the Infrastructure > PXE
menu. If one system image name is 256 characters, this causes
the problem to manifest.
Selenium is not sending the keys I tell it to, or is filling the box with junk¶
This should not be happening now since framework is configured to be more intelligent than Selenium
and it detects whether the element filled is a file input or not. Because Selenium can be running
remotely, if you want to upload a file, Selenium first needs to upload the file to the remote
executor and then it changes the string accordingly. This happens in default Selenium configuration,
as the selenium.webdriver.remote.file_detector.LocalFileDetector
is used by default for
all keyboard input. Framework now sets it up so the
selenium.webdriver.remote.file_detector.UselessFileDetector
is used by default and if
the element filled is an input with type file, then the file detector is actually used.
When getting the text of the element, Selenium returns an empty string¶
Stop using the .text
property of the WebElement
and use
cfme.fixtures.pytest_selenium.text()
, which solves this issue. The thing is, when an
element is eg. obscured, Selenium can’t read it. So the text
function first tries to scroll the
page so the element is visible, and if that does not help, it uses a bit of JavaScript to pull the
text out.