我有脚本来选择下面的按钮
driver.find_element_by_id("Product").click()
driver.find_element_by_id("id1").click()
driver.find_element_by_id("id1").click()
driver.find_element_by_id("id2").click()
driver.find_element_by_id("id2").click()
driver.find_element_by_id("id3").click()
driver.find_element_by_id("id3").click()
driver.find_element_by_id("id4").click()
driver.find_element_by_id("id4").click()
driver.find_element_by_id("id5").click()
driver.find_element_by_id("id5").click()
driver.find_element_by_id("id6").click()
driver.find_element_by_id("id6").click()
driver.find_element_by_id("id7").click()
driver.find_element_by_id("id7").click()
所以我在这里选择按钮产品然后它有多个项目。每个代码都会选择产品并取消选择
如何循环这个id选择而不是像编写一次产品按钮那样编写长脚本然后循环选择产品中的所有项目
这可以减少您的代码,您可以使用所需的适当范围。
driver.find_element_by_id("Product").click()
for element_id in range(1, 8):
id = "id{}".format(element_id)
driver.find_element_by_id(id).click()
driver.find_element_by_id(id).click()
@COLDSPEED的评论指出了我们正确的方向,因为@VaibhavMule的答案接近完美,但他们都没有考虑click()
从Selenium
角度来看的影响。
click()将通过selenium.webdriver.remote.webelement
界面与文档交互。
因此,click()方法调用将执行新鲜度检查以确保元素引用仍然有效。这基本上决定了元素是否仍然附加到DOM。如果此测试失败,则抛出StaleElementReferenceException
,并且将来对此实例的所有调用都将失败。因此,在调用每个click()
之前,我们必须使用设置为WebDriverWait
的expected_conditions
子句来诱导element_to_be_clickable
。
所以对于loop this id selections
到select and deselect them
,你可以使用以下代码块:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.find_element_by_id("Product").click()
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, "id1")))
for id in range(1, 7):
my_id = "my_id{}".format(id)
WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.ID, "my_id"))).click()
WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.ID, "my_id"))).click()