博客园  :: 首页  :: 管理

笔者使用的环境: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