0

I have to randomly select an element from todo list app and click to delete it. Basically, every element has the same selector, just index changes (e.g.//*[@class="destroy"])[2]). I have code that generates random sentences and adds them to the app. Then I have to randomly select an element -> click on it to delete and here I got stuck. Random.choice selects a random number and actually, it works. But sometimes if it randomly selects [0] the test fails and test execution takes a lot of time and I believe there is a more professional way to make a random choice. Could you please advise other possible ways?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
import random
import os
 
@keyword
    def open_browser(self):
        os.environ['MOZ_HEADLESS'] = '1'
        self.driver = webdriver.Firefox()
        self.driver.get('http://todomvc.com/examples/react/#/')
        self.driver.implicitly_wait(20)
@keyword
    def generate_random_sentences(self, number, total_items_amount):
        words = [["One", "Two", "Three", "Four"], ["red", "yellow", "green", "blue"],
                 ["cats", "dogs", "zebras", "pandas"], ["jumped.", "danced.", "wrote poetry.", "cried."]]
        for i in range(int(number)):
            sentences = ' '.join([random.choice(w) for w in words])
            self.driver.find_element(By.CLASS_NAME, "new-todo").send_keys(sentences, Keys.ENTER)
        total_items = self.driver.find_element(By.CLASS_NAME, "todo-count")
        assert total_items.text == total_items_amount```

@keyword
    def delete_random_element(self, total_items_amount):
        i = random.choice(range(51))
        list_item = self.driver.find_element(By.XPATH, '(//*[@class="view"]){}'.format([i])) 
        hidden_button = self.driver.find_element(By.XPATH, '(//*[@class="destroy"]){}'.format([i])) 
        actions = ActionChains(self.driver)
        actions.move_to_element(list_item)
        actions.click(hidden_button)
        actions.perform()
        total_items = self.driver.find_element(By.CLASS_NAME, "todo-count")
        assert total_items.text == total_items_amount```

1 Answer 1

2

You can use random.randint(start, end) to specify a range of integers that can be randomly selected and pass that as the index.

random_element = f'//*[@class="destroy"])[{random.randint(startint,endint)}]'
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.