Python/Selenium: Select几个下拉菜单完全相同类,select一个值,刷新浏览器并重启脚本

Python/Selenium: Select all identical classes of several dropdown menus, select a value, refresh browser and restart script

我使用 CMS,我必须将用户状态从“待定”更改为“已确认”。如果我手动执行,则必须单击下拉值。页面上有 12 个下拉菜单,下拉值始终相同。然后我必须刷新浏览器并单击接下来的 12 个下拉菜单。

我用 Selenium 编写了这个 Python 脚本:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options

import time

options = Options()
options.add_argument("user-data-dir=selenium")
driver = webdriver.Chrome(options=options)

driver.get("https://url.com")


select = Select(driver.find_element_by_class_name('address-status'))

select.select_by_value('1')

time.sleep(1)
driver.close()

这是下拉列表的 html:

<select name="data[status]" class="address-status" data-id="44980" id="status">
  <option value="2">Post card sent</option>
  <option value="1">Confirmed</option>
  <option value="0" selected="selected">Pending</option>
</select>

我自己无法解决的问题是:

  1. 脚本只选择了'adress-status'的第一个class,然后选择了我想要的值,然后就停止了。但是还有 11 个相同的 classes/dropdown 菜单必须选择(相同的)值。

  2. 我不知道如何刷新页面以获取下一组下拉菜单并重新开始选择process/script。

我发现我可能必须循环部分脚本,但我昨天第一次学习和使用 Python,但我无法及时解决这个任务。

我有类似的问题。您需要按索引 select address-status 元素。

  1. 找不到 address-status 个元素
n_elements = len(driver.find_elements_by_class_name('address-status'))
  1. 每次刷新后再次查找所有元素,但选择索引不同的元素
for idx in range(n_elements):
    element = driver.find_elements_by_class_name('address-status')[idx]
    # do what you need with the element
    ...
    # refresh the page
    ...

这是我的解决方案

  1. 找到所有下拉元素。它将 return 所有网络元素的列表 class name = "address-status"

  2. 使用循环 select 确认值

     # find all dropdown element
     list_drop_down = driver.find_elements_by_class_name("address-status")
    
     # select confirmed value for each dropdown
     for drop_down_element in list_drop_down:
         select = Select(drop_down_element)
         select.select_by_value('1')
    

在详细了解 Python 并将我学到的所有知识添加到脚本中后,我终于实现了我在最初发帖中提到的每一步。

步骤是:

  1. 打开Chrome 我正在使用我的用户数据打开 webdriver.Chrome,因为我需要保持登录到我正在使用的 CMS。我通过向 options

    添加一个参数来实现这一点
  2. 找出所有相同的classes 这个特殊的 class 代表一个下拉菜单

  3. 遍历所有下拉菜单

  4. Select值

  5. 1秒休眠时间 由于某些原因,脚本有时不会 select 所有值,所以这有帮助。这可能与下一步关闭浏览器有关,但我不确定。

  6. 关闭Chrome 在我的例子中,这是将 selected 值保存到 CMS

    所必需的
  7. 重启脚本 我定义了一个 40 次重复的 while 循环。请注意 IndentationError 意味着向循环元素添加一个选项卡(我知道这是基本的东西但可能对像我这样的新手有用)。否则脚本将无法运行。另见 Nested for loop IndentationError: expected an indented block when using calendar module

这是我的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options

import time
count = 0
while count < 40:
    print(count)
    options = Options()
    options.add_argument("user-data-dir=selenium")
    driver = webdriver.Chrome(options=options)
    driver.get(
        "https://URL")

    # find all dropdown element
    list_drop_down = driver.find_elements_by_class_name("address-status")

    # select confirmed value for each dropdown
    for drop_down_element in list_drop_down:
        select = Select(drop_down_element)
        select.select_by_value('1')

    time.sleep(1)
    driver.close()
    count = count+1

感谢用户 Trinh Phat 给了我必要的推动。我的工作场所现在爱我 ;)