【问题标题】:problem in clicking radio button can't able to select a radio button. Message: stale element reference: element is not attached to the page document单击单选按钮时的问题无法选择单选按钮。消息:过时的元素引用:元素未附加到页面文档
【发布时间】:2021-10-08 04:06:52
【问题描述】:

错误:selenium.common.exceptions.StaleElementReferenceException:消息:过时的元素引用:元素未附加到页面文档。

我正在抓取的网站https://www.telekom.de/unterwegs/apple/apple-iphone-13-pro/graphit-512gb 我想在每个部分循环这个关税细节,每个单选按钮显示不同的价格。我想一一抓取每个单选按钮的价格详细信息,并检查单选按钮名称以及价格,直到页面末尾。我已经尝试过,但我无法成功。

任何人都可以帮助解决这个问题。我会帮助我学习。我一直在尝试更改关税链接,但我正面临着获取详细信息的问题。更改以下链接中给出的关税链接,

  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

“我正在尝试单击一个单选按钮,并且需要为选定的单选按钮抓取价格详细信息。”

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()

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    选择不同的选项后,页面会刷新,因此出现了问题。我无法找到您尝试单击代码中按钮的位置。因此尝试使用以下代码单击所有radio buttons 并成功。检查代码一次。

    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)
    

    【讨论】:

      【解决方案2】:

      请用 li 元素代替 span

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

      点击后还会添加等待。 5 秒。然后点击下一个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 2014-08-30
        • 2018-09-01
        • 1970-01-01
        • 2018-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多