Clicking a specific item within a drop down list
DL Neil
PythonList at DancesWithMice.info
Tue Apr 2 22:16:03 EDT 2019
Richard,
(this is a Python list, and whilst the question is quite proper - your
are using Python after all, the answer delves into Selenium and then
dives into HTML and finally disappears into 'the dark side' of JavaScript!)
On 3/04/19 2:02 PM, rlew2008 at gmail.com wrote:
> Hi dn,
> Thank you kindly for your warm greeting. Please forgive my lack of forum decorum, I just started Python 2 days ago out of necessity, so I'm still quite unknowledgable about a lot of things.
> I'm working on a person project. So far, my only resources to date have been forums based off of Google searches, and a YouTube video: https://www.youtube.com/watch?v=rfscVS0vtbw
> This is the code that I have so far:
> from selenium import webdriver
> driver = webdriver.Chrome()
> driver.get("http://financials.morningstar.com/balance-sheet/bs.html?t=XNAS:AAPL®ion=usa&culture=en-US")
> import time
> time.sleep(2)
> driver.find_element_by_id("menu_A")
> driver.("Quarterly")
> When I run it, I get this error code:
> selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"Quarterly"}
> I've exhausted all of the forum posts I can find on this topic, but I've still been unable to solve it. Any suggestions on how to solve it are eagerly welcomed.
Python is being helpful. Stop and read the error message: "Unable to
locate element". What can you learn from the components of that msg?
The error was found by Selenium.
Did you look within their documentation?
Sadly, a quick web-search link to their web site basically repeats the
err.msg. Big deal!
The subject Selenium is examining is a web page.
In this case the word "element" is not part of Python, nor is it part of
Selenium (per-se), but is an HTML term.
Have you opened that page in your web-browser? (bring it up again, if
necessary)
Usually I would suggest using the web-browser to look at HTML elements,
indeed Firefox's (right-mouse-click) Context Menu offers an "Inspect
Element" function, or use of the "Developer Tools" (F12). NB
Chromium/Chrome and presumably the Apple and MSFT products offer similarly.
In this case, may I recommend (first) using the web-browser's "View
Source" facility (Context or Tool menus) to inspect the HTML code of
this web page.
What happens when you try to find "Quarterly" on the page?
Yes, it is found, but that's not in the place you expect ("menu_A")!
Return to the web page and now try the "Inspect Element" function.
Ahah, the "quarterly" link content *is* there.
What is going on?
Return to the page source, scroll through to (manually) find the Balance
Sheet. It's not there either!
Yet, on the web page you can see it with your own eyes!!!???
What is there, around line 259 of the HTML, is a call to a JavaScript
script.
What did I say about "going over to the dark side"?
You ask Selenium to load a web page. In turn, the browser/driver
discovers that the web-page/HTML loads other items/files, eg graphics,
CSS files, and JavaScript code files.
That's where the problem (seems to) lies - and it also explains the
difference between Firefox's "View Source" facility and the "Developer
Tools". Selenium works fast. Accordingly, as soon as the HTML page is
available, it finds "menu_A" and thence attempts to find the "Quarterly"
link. Unfortunately, the JavaScript needs to be loaded (from a separate
file on the web server) and executed. You have a "race condition". The
solution (hopefully - I have not tested it) is to add a delay between
the page-load and the search-analysis (and possibly again, to allow the
quarterly analysis to load before commencing the next step...
WebRefs:
https://stackoverflow.com/questions/6936149/how-to-use-find-element-by-link-text-properly-to-not-raise-nosuchelementexcept
https://en.wikipedia.org/wiki/Race_condition
Let us know how you get on...
--
Regards =dn
More information about the Python-list
mailing list