Home > Back-end >  problem in clicking radio button can't able to select a radio button. Message: stale element re
problem in clicking radio button can't able to select a radio button. Message: stale element re

Time:10-12

Error : selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document.

website I'm scraping https://www.telekom.de/unterwegs/apple/apple-iphone-13-pro/graphit-512gb I wanted to loop this tariff details with each section and each radio button shows different prices. I wanted to scrape, price details for each radio buttons one by one and checked radio button name along with price till end of the page. I have tried but I couldn't make success.

could anyone help on this. I will be helpful for me to learn. I have tried till get entered in to change tariff link and I'm facing issue to scrape a details. change tariff links given below links,

  https://i.stack.imgur.com/RRyJa.png
  https://i.stack.imgur.com/fNafB.png
  https://i.stack.imgur.com/jFnLA.png
  https://i.stack.imgur.com/WlyLU.png

"I'm trying to click a radio button and need to scrape a price details for selected radio button."

import xlwt
from selenium import webdriver
import re
import time
from datetime import date
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

class telekommobiles:
    def __init__(self):
        self.url="https://www.telekom.de/mobilfunk/geraete/smartphone?page=1&pageFilter=promotion"
        self.country='DE'
        self.currency='GBP'
        self.VAT='Included'
        self.shipping = 'free shipping within 3-4 weeks'
        self.Pre_PromotionPrice ='N/A'
        self.color ='N/A'
    def telekom(self):
        #try:
            driver=webdriver.Chrome()
            driver.maximize_window()          
            driver.get(self.url)
            today = date.today()
            #time.sleep(5)
            WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH,"//*[@id='consentAcceptAll']")))
            cookies = driver.find_element_by_css_selector('button.cl-btn.cl-btn--accept-all').click()
            print("cookies accepted")            
            links_prod_check = []
            prod_models = []
            prod_manufacturer =[]
            prod_memorys = []
            product_colors =[]
            product_price_monthly_payments = []
            product_price_one_time_payments =[]
            product_links = []
            containers = driver.find_elements_by_css_selector('div[class="styles_item__12Aw4"]')
            i = 1            
            for container in containers:
                p_links =container.find_element_by_tag_name('a').get_attribute('href')
                i = i   1
                product_links.append(p_links)
                #print(p_links)
            for links in product_links:
                driver.get(links)
                #time.sleep(5)
                
                #print(driver.current_url)
                #links_prod_check.append(driver.current_url)

                coloroptions = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH,"//li[@data-qa='list_ColorVariant']")))
                #print(coloroptions)
                for i in range(len(coloroptions)):
                    coloroption = driver.find_elements_by_xpath("//li[@data-qa='list_ColorVariant']")
                    coloroption[i].click()
                    #print(coloroption[i])
                    time.sleep(3)

                    memoryoptions = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH,"//span[@class='phx-radio__element']")))
                    for i in range(len(memoryoptions)):
                        memoryoption = driver.find_elements_by_xpath("//span[@class='phx-radio__element']")
                        try:
                            memoryoption[i].click()
                        except:
                            pass
                        time.sleep(3)

                        change_traiff = driver.find_element_by_css_selector('button[class="phx-link phx-list-of-links__link js-mod tracking-added"]').click()
                        time.sleep(3)
                        section_loops = driver.find_elements_by_css_selector('section[class="tariff-catalog--layer"]')
                        for section_loop in section_loops:
                            #Headings
                            heading_1 = section_loop.find_element_by_css_selector('h2[class="page-title page-title--lowercase"]').text
                            print(heading_1)
                            looping_for_tariff = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH,"//span[@class='phx-radio__element']")))
                            
                            subcontainers = section_loop.find_elements_by_css_selector('div[class="phx-tariff-box__section"]')
                            for subcontainer in subcontainers:
                                radio_buttons_list=subcontainer.find_elements_by_css_selector('div[class="phx-form__row phx-form__row--small phx-form__row--full-width phx-form__row--radio"]')
                                for radio in radio_buttons_list:
                                    input=radio.find_elements_by_css_selector('span[class="phx-radio__element"]')
                                    if input[0].is_enabled():
                                        try:
                                            ActionChains(driver).move_to_element(subcontainer).perform()
                                            time.sleep(2)
                                            input[0].click()
                                            time.sleep(3)
                                        except:
                                            print('Not clickable')
                                            pass
                                        lable_list=radio.find_elements_by_css_selector('span[class="phx-radio__label"]')
                                        label=""
                                        if lable_list:
                                            label=lable_list[0].text
                                
                                        heading_2 = subcontainer.find_element_by_css_selector('p[class="phx-t6 phx-t--medium"]').text
                                        
                                        data_price_list= subcontainer.find_element_by_css_selector('div[class="phx-tariff-box__data-price"]')

                                        volumn_list=data_price_list.find_elements_by_css_selector('div[data-qa="label_Tariff_VolumeSize"]')
                                        volumn=""
                                        if volumn_list:
                                            volumn=volumn_list[0].text
                                        price_list=subcontainer.find_elements_by_css_selector('p[class="phx-price phx-price--size_large phx-price--strong phx-price--color_brand"]')
                                        price=""
                                        nonBreakSpace = u'\xa0'
                                        if price_list:
                                            price=price_list[0].text

                                        print(str(heading_2)   " "   str(label)   " "   str(volumn.replace(' ', '').replace( '\\r\\n',''))   " "   str(price))                                


        #except:
            #pass
        
telekom_de=telekommobiles()
telekom_de.telekom()

CodePudding user response:

After selecting a different Option the page gets Refreshed, hence the issue. I was not able to find where you were trying to click on the buttons in your code. So tried to click on all the radio buttons with below code and was successful. Check the code once.

from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(executable_path="path to chromedriver.exe")
driver.maximize_window()
driver.implicitly_wait(10)

driver.get("https://www.telekom.de/unterwegs/apple/apple-iphone-13-pro/sierrablau-128gb")
wait = WebDriverWait(driver,30)
wait.until(EC.element_to_be_clickable((By.XPATH,"//button[text()='Accept All']"))).click()

radiooptions = wait.until(EC.presence_of_all_elements_located((By.XPATH,"//span[@class='phx-radio__element']")))

for i in range(len(radiooptions)):
    radiooptions = driver.find_elements_by_xpath("//span[@class='phx-radio__element']")
    radiooptions[i].click()
    time.sleep(2)

CodePudding user response:

please li element instead of span

//li[@data-qa='list_ColorVariant']

and also add wait once you click on it. 5secs. then click the next one

  • Related