I have a code which supposes to 'Mouse Over' the first layer of the element and then click on the second layer of the element which appears when you do 'Mouse Over' action. If I execute the code below it always shows me an error 'NoSuchElementException: Message: Unable to locate element: .e'. Please, help to understand what I am doing wrongly.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
def select_random_sentence_to_delete(self):
self.driver = webdriver.Firefox()
self.driver.get('http://todomvc.com/examples/react/#/')
action = ActionChains(self.driver);
firstLevelMenu = self.driver.find_element(By.CLASS_NAME, "view"[2])
action.move_to_element(firstLevelMenu).perform()
secondLevelMenu = self.driver.find_element(By.CLASS_NAME, "destroy"[2])
action.move_to_element(secondLevelMenu).perform()
secondLevelMenu.click() ```
You need to chain the actions and only after all the actions you perform()
:
driver.get("http://todomvc.com/examples/react/")
for i in range(10):
WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".new-todo")))
driver.find_element(By.CSS_SELECTOR, ".new-todo").send_keys(i, Keys.ENTER)
WebDriverWait(driver,30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".view input")))
for ele in driver.find_elements(By.CSS_SELECTOR, ".view input"):
ele.click()
actions = ActionChains(driver)
actions.move_to_element(ele).move_to_element(driver.find_element(By.CSS_SELECTOR, ".destroy")).click().perform()
Note: I added WebDriverWait
so you'll need to import it too.
Here are the imports:
from selenium.webdriver import ActionChains
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