0

Hello

I created few selenium scripts before on python and they are working fine but don't know why it's not working on a website. I'm trying to click on a element which appear when "DISQUS" is loaded on that website. Disqus is a comment section on website which loads after website loading.

So I used sleep method but it didn't work so I tried it with python IDLE to execute code line one by one so I can run locate code once Disqus comment section is completely available but still getting same error. "Webdriver unable to locate element"

Here is my code.

import selenium
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
browser = webdriver.Chrome('E:\\ChromeDriver\\chromedriver_win32\\chromedriver.exe')
browser.get('https://www.eloanus.com/customers-review') 
dicuss = browser.find_element_by_class_name('textarea')
print(dicuss)

Error, I'm getting.

Traceback (most recent call last):
  File "C:\Users\Acer-573G\PycharmProjects\Appium\venv\import selenium.py", line 12, in <module>
    dicuss = browser.find_element_by_class_name('textarea')
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 563, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 966, in find_element
    'value': value})['value']
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"class name","selector":"textarea"}
  (Session info: chrome=69.0.3497.100)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)

I attached the screen shot of inspect element (class) from that website.

Inspect element screen shot

I'm new to programming, any help would be appreciated.

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352

2 Answers2

1

There are multiple iframes, so you have to switch to it before you want the interaction.

It's always a good practice if you switch the control of driver to default once you are done.

Code :

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Chrome(executable_path = r'D:/Automation/chromedriver.exe')
driver.maximize_window()
driver.get("https://www.eloanus.com/customers-review")

wait = WebDriverWait(driver, 20)

visibilty_login = wait.until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Log In']")))

action = ActionChains(driver)

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[id$='disqusCommentsHolder']")))

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[title='Disqus']")))

driver.execute_script("window.scrollTo(0, 100)") 

wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Join the discussion…']/following-sibling::div[@class='textarea']"))).send_keys("Hi")

driver.switch_to.default_content()  

Hope this helps.

cruisepandey
  • 28,520
  • 6
  • 20
  • 38
0

To send a character sequence to the Disqus comment section you need to:

  • Induce WebDriverWait for the desired parent frame to be available and switch to it
  • Induce WebDriverWait for the desired nested frame to be available and switch to it
  • Induce WebDriverWait for the desired element to be clickable and you can use the following solution:
  • Code Block:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    browser=webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    browser.get('https://www.eloanus.com/customers-review') 
    WebDriverWait(browser, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='disq2disqusCommentsHolder']")))
    WebDriverWait(browser, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@id,'dsq-app') and @title='Disqus']")))
    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='textarea'][contains(@aria-label,'Join the discussion')]"))).send_keys("Michael Berger")
    
  • Browser Snapshot:

Disqus_comment_section

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352