2025全国大学生软件测试大赛-预选赛

环境

Python3.13

Selenium 4.38.0

pytest 8.4.2

import json
import os
import pickle
from datetime import datetime
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


@pytest.fixture( scope="function" )
def driver():
    # 提交最终代码脚本时,请将驱动路径换回官方路径"C:\\Users\\86153\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe"
    service = Service(
        executable_path="C:\\Users\\86153\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe" )
    driver = webdriver.Chrome( service=service )
    driver.get( "https://map.baidu.com/ " )
    driver.maximize_window()
    driver.implicitly_wait( 10 )
    yield driver
    driver.quit()


class TestBaiDuMap:
    @pytest.mark.parametrize( "from_routes,to_routes,screen", [
        ("南京大学(鼓楼校区)", "新街口商业步行区", "BaiDuMap_R001_001.png"),
        ("东南大学(四牌楼校区)", "先锋书店(五台山店)", "BaiDuMap_R001_002.png"),
        ("南京大学(鼓楼校区)", "先锋书店(五台山店)", "BaiDuMap_R001_003.png"),
        ("东南大学(四牌楼校区)", "新街口商业步行区", "BaiDuMap_R001_004.png")
    ] )
    def test_BaiDuMap_R001(self, driver, from_routes, to_routes, screen):
        driver.find_element( "xpath", '//div[@data-title="路线"]' ).click()
        driver.find_element( "xpath", "//div[@data-index='bus']" ).click()
        driver.find_element( "xpath", "//input[@placeholder='输入起点或在图区上选点']" ).send_keys( from_routes )
        driver.find_element( "xpath", "//input[@placeholder='输入终点']" ).send_keys( to_routes )
        sleep( 2 )
        driver.find_element( "xpath", "//input[@placeholder='输入终点']" ).click()
        driver.find_element( "id", "search-button" ).click()
        try:
            WebDriverWait( driver, 10 ).until(
                EC.presence_of_element_located( (By.XPATH, "//*[@id='type0']") ) )
        except TimeoutException:
            print( "没有找到路线" )
        TestBaiDuMap.take_screenshot( driver, screen )

    def test_BaiDuMap_R002(self, driver):
        driver.find_element( "xpath", '//div[@data-title="路线"]' ).click()
        driver.find_element( "xpath", "//div[@data-index='bus']" ).click()
        driver.find_element( "xpath", "//input[@placeholder='输入起点或在图区上选点']" ).send_keys(
            "南京大学(鼓楼校区)" )
        driver.find_element( "xpath", "//input[@placeholder='输入终点']" ).send_keys( "南京大学(仙林校区)" )
        sleep( 2 )
        driver.find_element( "xpath", "//input[@placeholder='输入终点']" ).click()
        driver.find_element( "id", "search-button" ).click()
        sleep( 4 )
        # 使用显式等待确保元素加载完成
        wait = WebDriverWait( driver, 10 )
        element_ids = ["type0", "type5", "type2", "type3"]
        for i, elem_id in enumerate( element_ids ):
            try:
                # 重新定位元素,避免StaleElementReferenceException
                element = wait.until( EC.element_to_be_clickable( (By.ID, elem_id) ) )
                element.click()
                sleep( 2 )
                # 截图前也重新定位元素
                TestBaiDuMap.take_screenshot( driver, f"BaiDuMap_R002_00{i + 1}.png" )
            except Exception as e:
                print( f"处理元素 {elem_id} 时出错: {e}" )

    def test_BaiDuMap_R003(self, driver):
        driver.find_element( "xpath", '//div[@data-title="路线"]' ).click()
        driver.find_element( "xpath", "//div[@data-index='bus']" ).click()
        driver.find_element( "xpath", "//input[@placeholder='输入起点或在图区上选点']" ).send_keys(
            "玄武湖景区" )
        driver.find_element( "xpath", "//input[@placeholder='输入终点']" ).send_keys( "先锋书店(五台山店)" )
        sleep( 2 )
        driver.find_element( "xpath", "//input[@placeholder='输入终点']" ).click()
        driver.find_element( "id", "search-button" ).click()
        sleep( 2 )
        jq = driver.find_element( By.XPATH, '//*[@id="RA_ResItem_0"]/table/tbody/tr[1]' )
        actions = ActionChains( driver )
        actions.move_to_element( jq ).perform()
        ss = driver.find_element( By.XPATH, "//*[@id='RA_ResItem_0']/table/tbody/tr[1]/td[2]/div" )
        actions.move_to_element( ss ).click().perform();
        driver.find_element( By.LINK_TEXT, "查看全部线路" ).click()
        sleep( 5 )
        driver.find_element( "xpath",
                             "//div[text()='                                                            48路                    ']" ).click()
        sleep( 5 )
        ele = driver.find_element( By.CSS_SELECTOR, '#route_2 > h3.no2 > div > a' )
        ActionChains( driver ).double_click( ele ).perform()
        sleep( 5 )
        TestBaiDuMap.take_screenshot( driver, "BaiDuMap_R003_001.png" )

    def test_BaiDuMap_R004(self, driver):
        driver.find_element( "xpath", "//*[@id='ui3_city_change']/a" ).click()
        driver.find_element( "xpath", "//*[@id='selCityHotCityId']/a[@name='南京']" ).click()
        driver.find_element( "xpath", "//*[@id='ui3_control_wrap']/div[2]/div[1]" ).click()
        driver.find_element( "xpath", "//*[@id='tarffic_ss']" ).click()
        driver.find_element( "xpath", "//*[@id='bt_trafficCtrl']" ).click()
        sleep( 2 )
        TestBaiDuMap.take_screenshot( driver, "BaiDuMap_R004_001.png" )

    def test_BaiDuMap_R005(self, driver):
        driver.find_element( "xpath", "//*[@id='ui3_city_change']/a" ).click()
        driver.find_element( "xpath", "//*[@id='selCityHotCityId']/a[@name='南京']" ).click()
        driver.find_element( "xpath", "//*[@id='ui3_control_wrap']/div[2]/div[1]" ).click()
        driver.find_element( "xpath", "//*[@id='tarffic_yc']" ).click()
        wait = WebDriverWait( driver, 10 )
        element_ids = ['week_trafficCtrl_0', 'week_trafficCtrl_1', 'week_trafficCtrl_2', 'week_trafficCtrl_3'
            , 'week_trafficCtrl_4', 'week_trafficCtrl_5', 'week_trafficCtrl_6']
        for i, elem_id in enumerate( element_ids ):
            try:
                element = wait.until( EC.element_to_be_clickable( (By.ID, elem_id) ) )
                element.click()
                sleep( 2 )
                TestBaiDuMap.take_screenshot( driver, f"BaiDuMap_R005_00{i + 1}.png" )
            except Exception as e:
                print( f"处理元素 {element_ids[i]} 时出错: {e}" )

    def test_BaiDuMap_R006(self, driver):
        driver.find_element( "xpath", "//*[@id='ui3_city_change']/a" ).click()
        driver.find_element( "xpath", "//*[@id='selCityHotCityId']/a[@name='南京']" ).click()
        driver.find_element( "xpath", "//*[@id='ui3_control_wrap']/div[2]/div[1]" ).click()
        driver.find_element( "xpath", "//*[@id='tarffic_yc']" ).click()
        dragElement = driver.find_element( "id", "bar_trafficCtrl" )
        print( dragElement )
        # 创建 ActionChains 对象
        action = ActionChains( driver )
        # 模拟鼠标拖动操作
        # 假设我们向右拖动 50像素
        # 这里比赛时要求移动到下午
        action.drag_and_drop_by_offset( dragElement, -300, 0 ).release().perform()
        sleep( 2 )
        action.drag_and_drop_by_offset( dragElement, 145, 0 ).release().perform()
        sleep( 2 )
        TestBaiDuMap.take_screenshot( driver, "BaiDuMap_R006_001.png" )

    @pytest.mark.parametrize( "from_routes,to_routes,screen", [
        ("珠江路", "南京站", "BaiDuMap_R007_001.png"),
        ("新街口", "南京站", "BaiDuMap_R007_002.png"),
        ("珠江路", "卡子门", "BaiDuMap_R007_003.png"),
        ("新街口", "卡子门", "BaiDuMap_R007_004.png")
    ] )
    def test_BaiDuMap_R007(self, driver, from_routes, to_routes, screen):
        driver.find_element( "xpath", "//*[@id='ui3_city_change']/a" ).click()
        driver.find_element( "xpath", "//*[@id='selCityHotCityId']/a[@name='南京']" ).click()
        driver.find_element( "xpath", "//*[@id='ui3_control_wrap']/div[2]/div[2]" ).click()
        driver.find_element( "xpath", "//*[@id='sub_start_input']" ).send_keys( from_routes )
        driver.find_element( "xpath", "//*[@id='sub_end_input']" ).send_keys( to_routes )
        driver.find_element( "id", "search-button" ).click()
        sleep( 2 )
        TestBaiDuMap.take_screenshot( driver, screen )

    def test_BaiDuMap_R008(self, driver):
        driver.find_element( "xpath", "//*[@id='ui3_city_change']/a" ).click()
        driver.find_element( "xpath", "//*[@id='selCityHotCityId']/a[@name='南京']" ).click()
        driver.find_element( "xpath", "//*[@id='ui3_control_wrap']/div[2]/div[2]" ).click()

        # 使用 dispatchEvent 触发点击事件
        element = driver.find_element( "name", '大行宫' )
        driver.execute_script( "var evt = document.createEvent('MouseEvents');"
                               "evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);"
                               "arguments[0].dispatchEvent(evt);", element )
        sleep( 2 )
        elementOne = driver.find_element( "name", '马群' )
        driver.execute_script( "var evt = document.createEvent('MouseEvents');"
                               "evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);"
                               "arguments[0].dispatchEvent(evt);", elementOne )

        driver.find_element( "id", "search-button" ).click()
        sleep( 2 )
        TestBaiDuMap.take_screenshot( driver, "BaiDuMap_R008_001.png" )

    @staticmethod
    def take_screenshot(driver, file_name):
        timestamp = datetime.now().strftime( "%H%M%S%d%f" )[:-3]
        timestamped_file_name = f"{timestamp}_{file_name}"
        screenshots_dir = "screenshots"
        if not os.path.exists( screenshots_dir ):
            os.makedirs( screenshots_dir )
        screenshot_file_path = os.path.join( screenshots_dir, timestamped_file_name )
        driver.save_screenshot( screenshot_file_path )

题干

20251103121026859.zip
zip文件
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容