Python/Selenium:选择几个下拉菜单中所有相同的类,选择一个值,刷新浏览器并重新启动脚本

Python/Selenium:选择几个下拉菜单中所有相同的类,选择一个值,刷新浏览器并重新启动脚本,python,selenium,google-chrome,selenium-webdriver,html-select,Python,Selenium,Google Chrome,Selenium Webdriver,Html Select,我与CMS合作,我必须将用户状态从待定更改为已确认。如果我手动操作,我必须单击一个下拉值。页面上有12个下拉列表,下拉列表值始终相同。然后我必须刷新浏览器并点击接下来的12个下拉列表 我用Selenium编写了这个Python脚本: from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.chrome.options import Options

我与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>
我自己无法解决的问题是:

脚本仅选择第一类“地址状态”,并选择我想要的值,但随后它停止。但是还有11个相同的类/下拉菜单必须选择相同的值

我不知道如何刷新页面以获得下一组下拉列表并重新启动选择过程/脚本


我发现我可能必须循环脚本的一部分,但昨天我第一次学习并使用Python,我就是不能及时理解它来完成这项任务。

我也有类似的问题。您需要按索引选择地址状态元素

找不到地址状态元素 每次刷新后,再次查找所有元素,但选择不同索引处的元素 这是我的解决方案

查找所有下拉元素。它将返回所有类名=地址状态的web元素的列表

使用循环选择确认值

 # 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的知识并将我学到的所有知识添加到脚本中之后,我终于完成了我在初始帖子中提到的每一步

这些步骤是:

开放式镀铬 我正在用我的用户数据打开webdriver.Chrome,因为我需要继续登录到我正在使用的CMS。我通过在选项中添加一个参数来实现这一点

查找所有相同的类 这个特定的类表示一个下拉菜单

循环浏览所有下拉列表

选择值

1秒睡眠时间 由于某些原因,脚本有时无法选择所有值,因此这很有帮助。这可能与下一步关闭浏览器有关,但我不确定

封闭铬 在我的情况下,这是将所选值保存到CMS所必需的

重新启动脚本 我定义了一个40次重复的while循环。注意IndentationError的意思是在循环元素中添加一个标签。我知道这是基本的东西,但对像我这样的新手可能有用。否则脚本将无法工作。也看到

这是我的密码:

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给了我必要的推动。我的工作场所现在爱我

所有下拉列表是否具有相同的值class=地址状态Yes所有下拉列表是否具有相同的“地址状态”类别谢谢!我不知道如何将你的代码实现到我的代码中。我只是在driver.get之后粘贴了你的代码,但它没有任何作用。它仍然只是选择第一个类的值并停止。也许关于刷新浏览器的事情让我有点困惑。该过程是:在浏览器中启动URL-选择一个下拉列表并依次输入值“1”12次-然后使用驱动程序关闭浏览器。关闭-重新启动脚本当然不会。您需要添加代码,这些代码是您对这些元素所做的功能。我相信选择只会选择元素,而不会单击。你需要点击它。顺便问一下,为什么每次都要刷新它?嗨,罗伯特,很抱歉无法应用您的解决方案。我的经验很少,所以理解你的代码有点困难,但我相信我的问题也可以通过它来解决。Phat Trinh的解决方案帮助了我。事实上,无需单击选择选项值。我以前尝试过用Javascript来完成这一切。我能够轻松地选择所有值,但在刷新存储所做选择的页面之后。这就是为什么我需要刷新它,因为它没有存储它。硒没有问题。我猜Selenium中的Select类确实触发了一种点击。哦,天哪,这就是选择所有12个下拉列表的技巧。这对我来说就像魔术一样谢谢:。您知道如何关闭浏览器,然后重新启动整个脚本吗?我用:import os | for I in rangex:| os.systempython script.py尝试了它,但我得到了以下错误:ImportError:无法从“selenium”未知位置导入名称“webdriver”。您可以将所有代码放在一个循环中,而不是os.systempython script.py。从选项到driver.close。把它全部放到循环中。或者你可以设置PYTHONPATH。按照此链接中的说明进行操作。如果两者都不起作用。创建另一个问题并发布代码和错误。对我来说,仅仅用几行就很难想象这个问题。谢谢你,我会尝试你的解决方案。你太棒了。我刚刚接受了你的解决方案。我很高兴:
 # 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')
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