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>
我自己无法解决的问题是:
脚本只选择了'adress-status'的第一个class,然后选择了我想要的值,然后就停止了。但是还有 11 个相同的 classes/dropdown 菜单必须选择(相同的)值。
我不知道如何刷新页面以获取下一组下拉菜单并重新开始选择process/script。
我发现我可能必须循环部分脚本,但我昨天第一次学习和使用 Python,但我无法及时解决这个任务。
我有类似的问题。您需要按索引 select address-status
元素。
- 找不到
address-status
个元素
n_elements = len(driver.find_elements_by_class_name('address-status'))
- 每次刷新后再次查找所有元素,但选择索引不同的元素
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
...
这是我的解决方案
找到所有下拉元素。它将 return 所有网络元素的列表 class name = "address-status"
使用循环 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 并将我学到的所有知识添加到脚本中后,我终于实现了我在最初发帖中提到的每一步。
步骤是:
打开Chrome
我正在使用我的用户数据打开 webdriver.Chrome,因为我需要保持登录到我正在使用的 CMS。我通过向 options
添加一个参数来实现这一点
找出所有相同的classes
这个特殊的 class 代表一个下拉菜单
遍历所有下拉菜单
Select值
1秒休眠时间
由于某些原因,脚本有时不会 select 所有值,所以这有帮助。这可能与下一步关闭浏览器有关,但我不确定。
关闭Chrome
在我的例子中,这是将 selected 值保存到 CMS
所必需的
重启脚本
我定义了一个 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 给了我必要的推动。我的工作场所现在爱我 ;)
我使用 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>
我自己无法解决的问题是:
脚本只选择了'adress-status'的第一个class,然后选择了我想要的值,然后就停止了。但是还有 11 个相同的 classes/dropdown 菜单必须选择(相同的)值。
我不知道如何刷新页面以获取下一组下拉菜单并重新开始选择process/script。
我发现我可能必须循环部分脚本,但我昨天第一次学习和使用 Python,但我无法及时解决这个任务。
我有类似的问题。您需要按索引 select address-status
元素。
- 找不到
address-status
个元素
n_elements = len(driver.find_elements_by_class_name('address-status'))
- 每次刷新后再次查找所有元素,但选择索引不同的元素
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
...
这是我的解决方案
找到所有下拉元素。它将 return 所有网络元素的列表 class name = "address-status"
使用循环 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 并将我学到的所有知识添加到脚本中后,我终于实现了我在最初发帖中提到的每一步。
步骤是:
打开Chrome 我正在使用我的用户数据打开 webdriver.Chrome,因为我需要保持登录到我正在使用的 CMS。我通过向 options
添加一个参数来实现这一点找出所有相同的classes 这个特殊的 class 代表一个下拉菜单
遍历所有下拉菜单
Select值
1秒休眠时间 由于某些原因,脚本有时不会 select 所有值,所以这有帮助。这可能与下一步关闭浏览器有关,但我不确定。
关闭Chrome 在我的例子中,这是将 selected 值保存到 CMS
所必需的重启脚本 我定义了一个 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 给了我必要的推动。我的工作场所现在爱我 ;)