我有这个程序,它登录到微软管理员,然后创建新的用户配置文件,我有一个 for 循环来执行此操作,但它在停止之前总是只运行两次。这可能是微软限制会话还是其他原因?
添加用户页面已打开,其余代码在前两个循环中运行良好,但当第三次运行循环时,它不会打开该页面。我在不同的计算机和不同的用户上尝试过,仍然是同样的问题。
有时它只运行一次,我尝试逐行运行代码,我可以确认 for 循环运行良好,但当它到达 for 循环内的 driver.get() 行时,它只是不打开。是否有服务器请求限制或类似的东西?
我隐藏了大部分代码只是为了方便隐私
def minecraft_creation():
global minecraft_student_counter
driver.maximize_window()
driver.get("https://admin.microsoft.com/")
sleep(4)
#i log into the account here (hidden)
for i in range(len(csv)):
driver.get(
"https://admin.microsoft.com/Adminportal/Home#/users/:/adduser"
)
sleep(4)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(
By.XPATH,
"//input[@data-automation-id='AddUserWizard_lastName']",
)
)
).send_keys(last_name)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(
By.XPATH,
"//input[@data-automation-id='AddUserWizard_firstName']",
)
)
).send_keys(first_name)
sleep(2)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(
By.XPATH,
"//input[@data-automation-id='AddUserWizard_displayName']",
)
)
).click()
sleep(2)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(
By.XPATH,
"//input[@data-automation-id='AddUserWizard_userName']",
)
)
).send_keys(username)
sleep(2)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(
By.XPATH,
"//input[@data-automation-id='AddUserWizard_password']",
)
)
).send_keys(str(datetime.today().year))
# driver.execute_script("arguments[0].click();", driver.find_element(By.CSS_SELECTOR, ".ms-Panel-content .ms-Checkbox.is-checked input"))
sleep(4)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']",
)
)
).click()
sleep(1)
driver.execute_script(
"arguments[0].click();",
driver.find_element(
By.XPATH,
"//input[@data-automation-id='ProductSkuId_94763226-9b3c-4e75-a931-5c89701abe66']",
),
)
sleep(1)
driver.find_element(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']"
).click()
sleep(1)
driver.find_element(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']"
).click()
sleep(3)
driver.find_element(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']"
).click()
sleep(3)
create_list.append(username)
account_notification = account_notification + username + "\n"
循环在停止前仅运行两次的问题可能是由多种因素引起的,包括会话限制、超时或 Web 自动化过程中的错误。以下是几个可能的原因及其解决方案:
会话超时或限制:如果 Microsoft 施加会话限制,则可能会导致脚本在一定时间后失败 操作次数。要诊断此问题,请监视任何错误消息 或可能表明会话限制已被取消的 HTTP 响应代码 到达。 未找到元素或超时问题:如果在指定时间内未找到元素,脚本将失败。你可能没有 考虑页面加载中的所有潜在状态或延迟 过程。
隐式/显式等待:确保使用适当的等待(隐式/显式)来处理元素的任何异步加载 正确地。
浏览器状态:经过几次迭代后,浏览器状态可能会由于未处理的弹出窗口或其他问题而进入意外状态 动态内容变化。这里有一些修改和最好的 您可以实施的实践来诊断并可能修复 问题:
添加日志记录 实现日志记录以了解脚本停止的位置。这将有助于诊断问题:
import logging
logging.basicConfig(level=logging.INFO)
def minecraft_creation():
global minecraft_student_counter
driver.maximize_window()
driver.get("https://admin.microsoft.com/")
sleep(4)
# i log into the account here (hidden)
for i in range(len(csv)):
logging.info(f"Starting iteration {i}")
try:
driver.get("https://admin.microsoft.com/Adminportal/Home#/users/:/adduser")
sleep(4)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//input[@data-automation-id='AddUserWizard_lastName']")
)
).send_keys(last_name)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//input[@data-automation-id='AddUserWizard_firstName']")
)
).send_keys(first_name)
sleep(2)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//input[@data-automation-id='AddUserWizard_displayName']")
)
).click()
sleep(2)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//input[@data-automation-id='AddUserWizard_userName']")
)
).send_keys(username)
sleep(2)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//input[@data-automation-id='AddUserWizard_password']")
)
).send_keys(str(datetime.today().year))
sleep(4)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']")
)
).click()
sleep(1)
driver.execute_script(
"arguments[0].click();",
driver.find_element(
By.XPATH,
"//input[@data-automation-id='ProductSkuId_94763226-9b3c-4e75-a931-5c89701abe66']",
),
)
sleep(1)
driver.find_element(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']"
).click()
sleep(1)
driver.find_element(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']"
).click()
sleep(3)
driver.find_element(
By.XPATH, "//button[@data-automation-id='addUserWizardNextBtn']"
).click()
sleep(3)
create_list.append(username)
account_notification += username + "\n"
logging.info(f"Successfully created user {username}")
except Exception as e:
logging.error(f"Error during iteration {i}: {str(e)}")
break
使用适当的等待 确保脚本充分等待每个元素。考虑在关键等待和操作周围使用 try/ except 块来优雅地处理意外错误。
刷新浏览器会话 如果怀疑会话限制,请考虑在几次迭代后刷新会话:
if i % 2 == 0:
logging.info("Refreshing session")
driver.quit()
driver = webdriver.Chrome() # or whatever driver you're using
driver.maximize_window()
driver.get("https://admin.microsoft.com/")
sleep(4)
# Log in again
处理弹出窗口和警报 检查是否有任何可能干扰该过程的弹出窗口或警报并进行适当处理。
每次迭代后进行清理 确保每次迭代都以干净的状态开始:
# Clear cookies and reset the browser state if needed
driver.delete_all_cookies()
driver.get("about:blank")
通过正确添加日志记录和处理异常,您可以诊断问题发生的位置并采取适当的措施来修复它。