1

Random timeout exception for the code below not sure whats the best approach to address these issues, and this timeout not happen all time, and also it does find elements sometime or all time

we appreciate your comments and suggestions and apparently explicit wait is not handling until the elements gets loaded into the browser application or elements are getting different interval in every single time when new page gets loaded

"""

"""

import platform , logging
import os,re
from time import  sleep
import selenium.webdriver.support.ui as ui
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

class Cloud(object):
    """
    cloud class to get query and response
    """

    def __init__(self, username='xxxxxx', password='xxxx'):

        logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO)
        self.logger = logging.getLogger(__name__)

        self.url = "https://www.amazon.com"
        self.username = username
        self.password = password
        self.timeout = 100
        self.driver = None
        self.get_chrome_driver()

    def get_chrome_driver(self):
        """
        get chrome driver
        """
        if platform.system().lower() == 'windows':
            if self.driver is None:
                chrome_options = Options()
                #chrome_options.add_argument('--disable-extensions')
                chrome_options.add_argument('--start-maximized')
                chrome_options.add_argument('--disable-popup-blocking')
                chrome_options.add_argument('--ignore-certificate-errors')
                chrome_options.add_argument('--allow-insecure-localhost')
                chrome_options.add_argument('--disable-infobars')
                chrome_options.add_argument("--log-level=3")
                chrome_driver_path = os.path.join(str(os.environ['PYTHONPATH'].split(';')[0]),"bin","chromedriver","chromedriver.exe")
                self.driver = WebDriver(executable_path=chrome_driver_path, chrome_options=chrome_options)
        return self.driver

    def login(self, username='xxxxxxx', password='xxxxx'):
        """
        Login into amazon cloud
        """
        self.logger.info("logging in amazon cloud username: %s and password: %s" %(self.username, re.sub(r".", "*", self.password)))
        self.driver.get(self.url)
        # wait for login username textbox

        self.wait_visibility_element(By.XPATH, "//div[@id='nav-signin-tooltip']//span[@class='nav-action-inner'][contains(text(),'Sign in')]")
        self.driver.find_element_by_xpath("  //div[@id='nav-signin-tooltip']//span[@class='nav-action-inner'][contains(text(),'Sign in')]").click()

        self.wait_visibility_element(By.XPATH,"//label[@class='a-form-label']")

        self.wait_visibility_element(By.XPATH,"//input[@id='ap_email']")
        username_textbox = self.driver.find_element_by_xpath("//input[@id='ap_email']")
        username_textbox.clear()
        username_textbox.send_keys(self.username)  
        self.driver.find_element_by_xpath("//input[@id='continue']").click() 
        self.wait_visibility_element(By.XPATH,"//input[@id='ap_password']")  #//label[@class='a-form-label']

        password_textbox = self.driver.find_element_by_xpath("//input[@id='ap_password']")
        password_textbox.clear()
        password_textbox.send_keys(self.password)
        # click on submit button
        self.driver.find_element_by_xpath("//input[@id='signInSubmit']").click()


    def wait_visibility_element(self, by_type, element_name):
        """
        wait for visibility of element
        :param by_type: Locate element using type of element
        :param element_name: element name
        """
        ui.WebDriverWait(self.driver, self.timeout).until(
            EC.visibility_of_element_located((by_type, element_name)))

    def get_audio_text(self, multi_turn_count=1):

        self.login()   
        #Arrow in the Top Menu 
        self.wait_visibility_element(By.XPATH, "//a[@id='nav-link-accountList']//span[@class='nav-icon nav-arrow']")
        ui.WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='nav-link-accountList']//span[@class='nav-icon nav-arrow']")))
        self.driver.find_element_by_xpath("//a[@id='nav-link-accountList']//span[@class='nav-icon nav-arrow']").click()

        #To avoid click event ambiguity
        firstLevelMenu = self.driver.find_element_by_xpath("//span[contains(@class,'nav-line-2')][contains(text(),'Account & Lists')]")
        action = ActionChains(self.driver)
        action.move_to_element(firstLevelMenu).perform()

        #sub menu select and click
        self.wait_visibility_element(By.XPATH, "//span[contains(text(),'Your Content and Devices')]")
        self.driver.find_element_by_xpath("//span[contains(text(),'Your Content and Devices')]").click() 
        #Alexa Privacy
        self.wait_visibility_element(By.XPATH, "//div[@id='ng-app']//div[2]//div[1]//div[1]//div[1]//div[1]//div[1]//div[2]//div[6]//div[1]//div[1]")
        self.driver.find_element_by_xpath("//div[@id='ng-app']//div[2]//div[1]//div[1]//div[1]//div[1]//div[1]//div[2]//div[6]//div[1]//div[1]").click()
        self.wait_visibility_element(By.XPATH,'//div[@class="navAlexaOptionTitle_alexaNavHeader_myx ng-binding"][contains(text(),"Review Voice History")]')

        ui.WebDriverWait(self.driver, self.timeout).until(
            EC.element_to_be_clickable((By.XPATH, '//div[@class="navAlexaOptionTitle_alexaNavHeader_myx ng-binding"][contains(text(),"Review Voice History")]')))

        ui.WebDriverWait(self.driver, self.timeout).until(EC.text_to_be_present_in_element((By.XPATH, '//span[@class="overviewHeadingString_myx ng-binding"]'), 'Alexa Privacy'))

        self.driver.find_element_by_xpath('//div[@class="navAlexaOptionTitle_alexaNavHeader_myx ng-binding"][contains(text(),"Overview")]').click()
        self.driver.find_element_by_xpath("//div[@class='navAlexaOptionTitle_alexaNavHeader_myx ng-binding'][contains(text(),'Review Voice History')]").click()

        # Select the dropdown box     
        self.wait_visibility_element(By.XPATH,"//span[@id='timePickerDesktop']//span[@class='a-button-text a-declarative']")
        ui.WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='timePickerDesktop']//span[@class='a-button-text a-declarative']")))
        self.driver.find_element_by_xpath("//span[@id='timePickerDesktop']//span[@class='a-button-text a-declarative']").click()

        #All history selection
        self.wait_visibility_element(By.XPATH,"//a[@id='timePickerDesktop_4']")
        ui.WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='timePickerDesktop_4']")))
        self.driver.find_element_by_xpath("//a[@id='timePickerDesktop_4']").click()

        # read first text format of the data
        self.wait_visibility_element(By.XPATH,"//span[@id='mainInfo-0']//div[contains(@class,'summaryCss')]")
        txt = self.driver.find_element_by_xpath("//span[@id='mainInfo-0']//div[contains(@class,'summaryCss')]").text
        question_text = txt.encode("utf-8")[3:-3]

        # Dropdown the rectangle menu        
        self.driver.find_element_by_xpath("//div[@id='arrowExpand-0']//i[@class='fa fa-angle-down caretAlignment']").click()

        # read AVS Response 
        self.wait_visibility_element(By.XPATH,"//div[@id='activityItemsInner-0']//div[@class='ttsInfo']")
        ui.WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='activityItemsInner-0']//div[@class='ttsInfo']")))
        txt = self.driver.find_element_by_xpath("//div[@id='activityItemsInner-0']//div[@class='ttsInfo']").text
        answer_text = txt.encode("utf-8")[3:-3]

        self.sign_out_direct()
        return question_text, answer_text

    def sign_out(self):

        #Sigout menu nevigation 
        self.driver.find_element_by_xpath("//i[@class='hm-icon nav-sprite']").click()
        self.wait_visibility_element(By.XPATH,"//div[contains(text(),'SHOP BY CATEGORY')]")

        #sign out      
        sign_out_element = self.driver.find_element_by_xpath("//li[44]//a[1]")
        self.driver.execute_script("arguments[0].scrollIntoView();", sign_out_element)
        #self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        ui.WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable((By.XPATH, "//li[44]//a[1]")))
        self.driver.find_element_by_xpath("//li[44]//a[1]").click()

        self.sign_out_direct()
        #Close current tab
        self.driver.close()

    def sign_out_direct(self):

        #Arrow in the Top Menu 
        self.wait_visibility_element(By.XPATH, "//a[@id='nav-link-accountList']//span[@class='nav-icon nav-arrow']")
        ui.WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='nav-link-accountList']//span[@class='nav-icon nav-arrow']")))
        self.driver.find_element_by_xpath("//a[@id='nav-link-accountList']//span[@class='nav-icon nav-arrow']").click()

        #To avoid click event ambiguity
        firstLevelMenu = self.driver.find_element_by_xpath("//span[contains(@class,'nav-line-2')][contains(text(),'Account & Lists')]")
        action = ActionChains(self.driver)
        action.move_to_element(firstLevelMenu).perform()

        #sub menu select and click
        self.wait_visibility_element(By.XPATH, "  //span[contains(text(),'Sign Out')]")
        self.driver.find_element_by_xpath("//span[contains(text(),'Sign Out')]").click() 

        #Close current tab
        self.driver.close()

if __name__ == '__main__':

    for loop in range(20):
        PAGE = Cloud()
        #PAGE.login()
        OUTPUT = PAGE.get_audio_text()
        print("\n\nQuestion:: %s"%str(list(OUTPUT)[0]).upper())
        print("Answer:: %s"%str(list(OUTPUT)[1]).upper())
        #PAGE.sign_out()
        #PAGE.sign_out_direct()
        sleep(2)

1 Answer 1

0

If you post the lines of code in particular that are throwing the timeout exceptions, this will help track down the issues easier.

I noticed most of your waits are for visibility_of_element_located. I would recommend trying to change some of those to element_to_be_clickable instead, because some elements will appear on the DOM before they are fully rendered.

Sign up to request clarification or add additional context in comments.

5 Comments

it is random and hard to pointout one specfic line of the code but all of them were in wait to load or find_elements, and but these issue were not consistent as sometime works and sometime doesn't , and pasted the whole code below for your reference, and i will your comments
i pasted the whole for your reference and i welcome your comments
most of the time issues were here,
There isn’t really a catch all solution to fix these time out issues. I recommend waiting on element_to_be_clickable instead of visibility_of and you may have better luck. I see in some cases you are doing two clicks in a row without waiting on the element too — try to implement logic that waits between every click and this may help too.
i did change to clickable and i am getting random error as [1005/190421.226:ERROR:context_group.cc(151)] ContextResult::kFatalFailure: WebGL2 blacklisted

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.