Home > Enterprise >  selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate elemen
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate elemen

Time:02-05

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"}
  (Session info: chrome=98.0.4758.82)
Stacktrace:
Backtrace:
        Ordinal0 [0x00BF7AC3 2587331]
        Ordinal0 [0x00B8ADD1 2141649]
        Ordinal0 [0x00A83BB8 1063864]
        Ordinal0 [0x00AB01CE 1245646]
        Ordinal0 [0x00AB03CB 1246155]
        Ordinal0 [0x00ADA612 1418770]
        Ordinal0 [0x00AC86D4 1345236]
        Ordinal0 [0x00AD8A0A 1411594]
        Ordinal0 [0x00AC84A6 1344678]
        Ordinal0 [0x00AA53F6 1201142]
        Ordinal0 [0x00AA62E6 1204966]
        GetHandleVerifier [0x00D9DF22 1680738]
        GetHandleVerifier [0x00E50DBC 2413564]
        GetHandleVerifier [0x00C8D151 563089]
        GetHandleVerifier [0x00C8BF13 558419]
        Ordinal0 [0x00B9081E 2164766]
        Ordinal0 [0x00B95508 2184456]
        Ordinal0 [0x00B95650 2184784]
        Ordinal0 [0x00B9F5BC 2225596]
        BaseThreadInitThunk [0x764A6739 25]
        RtlGetFullPathName_UEx [0x76F98AFF 1215]
        RtlGetFullPathName_UEx [0x76F98ACD 1165]

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.

Help.

[HTML button image]

What else to say? "It looks like your post is mostly code"

CodePudding user response:

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.

CodePudding user response:

As per the HTML:

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
    
  •  Tags:  
  • Related