首页 > 解决方案 > 在 Python Selenium 中为不同的 mat-select 选项选择/定位定位器的问题

问题描述

我对 Python Selenium 模块有以下问题。我想比较一个基于 Web 的时间表应用程序和另一个纯粹用于声明执行特定任务的时间(也是基于 Web 的)和数量的应用程序之间的数据。为了做到这一点,我决定 Selenium 和后来的 Pandas 将是要走的路。在时间表应用程序中,可以直接以 csv 格式下载数据,这样使用 Python 或 VBA 就很容易处理。但是,时间量声明工具没有该功能,并且要选择特定的周末结束日,我必须点击 html 中的 mat-option 标签。我试图通过为此运行一个循环来实现这一点,但这就是它变得棘手的地方。我检查了第一个可编辑/可选择的日子有 id "mat-option-55", 所以这就是我的循环开始的地方(顺便说一句,这可能不是完美的方法,我愿意接受建议)。但是,一旦循环开始,在成功选择循环中的第一天并设法将输出保存到 .csv 后,它无法获得下一个,即 id "mat-option-56",抛出 "NoSuchElementException" 错误。再次检查该元素后,我看到以下项目已更改为 id “mat-option-139”,这让我一无所知。它如何以及为什么可以动态地改变它,我如何在我的代码中抑制这种行为?我尝试了 Select 方法,该方法适用于下拉菜单,但由于某种原因不适用于 mat-option。我基本上想要实现的是通过其可见文本(例如“2021 年 1 月 15 日”)获得一天并将卷转换为 .csv,不一定有循环 - 任何解决方案都可以。在花费数小时寻找解决方案(包括在线搜索)后,我无处可去。

任何帮助、提示或建议将不胜感激。先感谢您。

这是我的代码(的相关部分):

user_name = "user"

with open("./pass_word.txt") as pass_word:
    pass_word = pass_word.read()   

driver = webdriver.Chrome("./chromedriver.exe")#, options=options)
driver.get(Url)

sleep(2)
   
w3 = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="credentialSignin"]')))
w3.click()

username = driver.find_element_by_id('user-name-input')
username.send_keys(user_name)
password = driver.find_element_by_id('password-input')
password.send_keys(pass_word)

remember_address = driver.find_element_by_name('checkbox1_lbl').click()

sign_in_button = driver.find_element_by_id('login-button')
sign_in_button.submit()
       
sleep(2)

for d in range(55,199): #the count of editable days starts at 55, 199 being the last editable day
    try:
        WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID, "mat-select-week-ending-dropdown"))).click()
        day = driver.find_element_by_id(f'mat-option-{d}')
        print(day.text)
        day.send_keys(Keys.ENTER)
        t = WebDriverWait(driver,15).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="container"]/div/div/div/ag-grid-angular/div/div[1]/div[2]/div[3]/div[2]/div/div'))).text
        StringData = StringIO(t)
        df = pd.read_csv(StringData, sep =";")
        print(df)
        df.to_csv(f"./test{d}.csv")
    except: continue 

循环中第一天的输出如下所示:

January 15, 2021
                   Action menu
0            0266 – NL- O2C
1          1448 – NL - O2C
2                            1
3                            1
4                            1
5                            1
6                            5
7                  Action menu
8   102 – Dispute/Deduction
9                            1
10                           7
11                           7
12                           7
13                           7
14                          35
15                 Action menu
16  0107 – Credit Management
17                           7

标签: pythonselenium-webdriver

解决方案


推荐阅读