笔者使用的环境:webdriver.Edge
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException from selenium.webdriver.edge.options import Options options = Options() options.add_argument("--start-maximized") options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_argument("--force-device-scale-factor=1.1") options.add_experimental_option("detach", True) driver=webdriver.Edge(options=options) aws_login_url=f'https://123265640789.signin.amazonaws.cn/console' driver.get(aws_login_url)
1、对输入框和按钮元素的定位,最常用的方法,就是通过 find_element 对ID 或者 NAME 进行定位 ,一般来说,<input xxxxx> 输入框,会同时有 id 和 name 两个属性的
# 对于输入框,通过 id 或者 name 定位 IAM_username_Input=driver.find_element(By.ID, 'username') IAM_username_Input.send_keys("qq5201351) Password_Input=driver.find_element(By.NAME, 'password') Password_Input.send_keys("pass123") # 对于按钮 也 理论上也可以通过 id 或者 name 进行定位 ,最多的情况还是通过 id 定位 Sign_in_Button=driver.find_element(By.ID, 'signin_button') Sign_in_Button.click()
2、但有时打开一个网址后,元素框没有加载出来,就容易报错,以aws登录界面就可以测试出来,可以通过加入time.sleep(5) 解决 ,但这种属于 强制等待
更专业一点的做法是通过 WebDriverWait(driver, 20) 显示等待 + util 指定条件 的方法来实现,这样就可以等到完全加载出来之后,再进行后面的填充操作,如下:
IAM_username_Input=WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "username"))) IAM_username_Input.send_keys("qq5201351)
3、如果没有id或name的,其实也可以通过 By.XPATH 对元素进行定位,可能经常写爬虫相关代码的,还更习惯于用 By.XPATH,这里列出了还能使用逻辑与的方式,精准定位
Password_Input = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//input[@id="i0118" and @name="passwd"]')))
Password_Input.send_keys("xxxxxxx")
4、除了 id , name , XPATH , 也还可以使用 By.CSS_SELECTOR 方式定位
# 元素数据 <button data-testid="mfa-submit-button" class="awsui_button_vjswe_lssc8_157 awsui_variant-primary_vjswe_lssc8_230 awsui_full-width_vjswe_lssc8_563" data-analytics-funnel-value="button:r2l:" type="submit" data-analytics-performance-mark="9-1752042110481-5764"><span class="awsui_content_vjswe_lssc8_153 awsui_label_1f1d4_ocied_5">Sign in</span></button> # 使用 By.CSS_SELECTOR 定位 Sencond_SingnIn_Button=WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "button[data-testid='mfa-submit-button']"))) Sencond_SingnIn_Button.click()
5、有时登录界面,点登录时,看着像是一个按钮,其实检查元素,有可能 是一个<input>元素,再定位到这个元素点登录时,使用上面的 EC.presence_of_element_located,还是可能失败
因为 presence_of_element_located 是基础存在性检查,不会检查 是否可以交互或者点击,推荐使用 而 element_to_be_clickable 是更严格的交互性检查(包含可见性与启用状态)
这种笔者常用于 登录 或者 超链接 文本的点击,网上查询,说是常用于 点击、输入等交互操作前(如按钮/输入框)
# Sign_in_button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//input[@id="idSIButton9" and @type="submit"]'))) Sign_in_button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//input[@id="idSIButton9" and @type="submit" and @value="Sign in"]'))) Sign_in_button.click()
尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/18974406
作者:一名卑微的IT民工
出处:https://www.cnblogs.com/5201351
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
由于博主的水平不高,文章没有高度、深度和广度,只是凑字数,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个卑微的IT民工!
浙公网安备 33010602011771号