过时元素引用:元素未附加到下拉列表python的页面文档

2024-09-30 10:27:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我为一个ASP.net网站并在运行时遇到stale element reference: element is not attached to the page document错误。在

脚本假设从下拉列表中逐个单击项目。共有4个下拉列表,当页面加载到第一个下拉列表时,下拉列表有选项,当我们单击第一个下拉列表的第二个选项时,在一段时间后页面将数据加载到第二个下拉列表中,其他下拉列表的过程相同,因此通过下面的代码,我可以选择第二个、第三个、第四个。。。。第一个下拉选项,然后在选择第二个下拉列表的第二个选项时出错

这是密码

# -*- coding: utf-8 -*-

import sys
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

def selectYear():
    year = driver.find_element_by_id("carYear")
    ActionChains(driver).move_to_element(year).click(year)
    year.click()
    WebDriverWait(year, 100).until(
        EC.presence_of_element_located((By.XPATH, ".//option[2]")))
    yearOptions = year.find_elements_by_tag_name("option")
    for option in yearOptions:
        optVal = option.get_attribute("value")
        if optVal is 0:
            continue
        else:
            print("Car Year is : %s" % optVal)
            dataList['Year'] = optVal
            ActionChains(driver).move_to_element(option).click(option)
            option.click()
            selectModel()

def selectMake(driver):
    make = driver.find_element_by_id("carMakeId")
    ActionChains(driver).move_to_element(make).click(make)
    make.click()
    WebDriverWait(make, 100).until(
        EC.presence_of_element_located((By.XPATH, ".//option[2]")))
    makeOptions = make.find_elements_by_tag_name("option")
    print makeOptions
    for option in makeOptions:
        optVal = option.get_attribute("value")
        if optVal == '0':
            continue
        else:
            print("Make is : %s" % optVal)
            dataList['Make'] = optVal
            ActionChains(driver).move_to_element(option).click(option)
            option.click()
            selectYear()


def main():
    driver.get("https://www.getunitronic.com/")
    WebDriverWait(driver, 200).until(
        EC.presence_of_element_located((By.ID, "carMakeId")))
    selectMake(driver)
# driver.close()

if __name__ == "__main__":
    dataList = {'Make' : "Make",
                'Year' : "Year",
                'Model' : "Model",
                'Engine' : "Engine",
                'Category' : "Category",
                'Product Type' : "Product Type",
                'Title' : "Title",
                'Stock Power' : "Stock Power",
                'Octane' : "Octane",
                'HP' : "HP",
                'LB-FT' : "LB-FT",
                'Desctiption' : "Description",
                'Installation' : "Installation",
                'UniCONNECT+' : "UniCONNECT+",
                'Features' : "Features",
                'Price' : "Price",
                'Media1' : "Media1",
                'Hardware Included' : "Hardware Included",
                'Recommended Software' : "Recommended Software",
                'Related Hardware' : "Related Hardware"}
    driver = webdriver.Chrome()
    sys.exit(main())

错误:

^{pr2}$

Tags: tofromimport列表makebydriverselenium
1条回答
网友
1楼 · 发布于 2024-09-30 10:27:42

更改您的代码

makeOptions = make.find_elements_by_tag_name("option")
print makeOptions
for option in makeOptions:
    optVal = option.get_attribute("value")
    if optVal == '0':
        continue
    else:
        print("Make is : %s" % optVal)
        dataList['Make'] = optVal
        ActionChains(driver).move_to_element(option).click(option)
        option.click()
        selectYear()

^{pr2}$

元素集合中的元素一旦更改就会过时。所以当你面对这样的问题时,你需要重新获得元素

相关问题 更多 >

    热门问题