'selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".ui flu~"}
This is the code I use:
import requests as r, sys as sus, bs4 as bs, webbrowser as wb
from selenium import webdriver as wd
dr = wd.Chrome()
b = r.get("https://uupdump.net/fetchupd.php?arch=amd64&ring=wif&build=latest").text
s = bs.BeautifulSoup(b, features="html.parser")
if "/selectlang.php?id=" in b:
l = b.split("/selectlang.php?id=")[1].split('"')[0]
u = f"https://uupdump.net/download.php?id={l}&pack=es-es&edition=professional"
print(u)
b = r.get(u).text
s = bs.BeautifulSoup(b, features="html.parser")
print(s)
dr.get(u)
b = dr.find_element_by_class_name('ui fluid right labeled icon primary button')
And this is the error:
uupdump.py:17: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
b = dr.find_element_by_class_name('ui fluid right labeled icon primary button')
Traceback (most recent call last):
File "C:\Users\Aritz\Downloads\thign\uupdump.py", line 17, in <module>
b = dr.find_element_by_class_name('ui fluid right labeled icon primary button')
File "C:\Users\Aritz\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 760, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "C:\Users\Aritz\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 1244, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\Aritz\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "C:\Users\Aritz\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".ui fluid right labeled icon primary button"}
What I want is to use Selenium to find a button by its class name from uupdump.net
, to download the latest version zip file.
Screenshot:
Solution 1:[1]
As per the HTML:
To identify the clickable element with text as Create download package you can use either of the following Locator Strategies:
Using xpath:
b = dr.find_element(By.XPATH, "//button[@class='ui fluid right labeled icon primary button' and contains(., 'Create download package')]")
Ideally to click on the element you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following Locator Strategies:
Using XPATH:
b = WebDriverWait(dr, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='ui fluid right labeled icon primary button' and contains(., 'Create download package')]")))
Note: You have to add the following imports :
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
Solution 2:[2]
To find the specific button element that you want you can do:
b = dr.find_elements_by_class_name('primary')[-1]
instead of
b = dr.find_element_by_class_name('ui fluid right labeled icon primary button')
Because the class name that you copied is a compilation of classnames for that object. Each class name is separated by a space. Therefore using the most unique identifier 'primary' we are able to narrow the elements down to 3 and see that the element that you want is the last one.
and then do
b.click()
to click on that element.
Though you may want to wait for that element to load on the page.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | undetected Selenium |
Solution 2 |