python - 查找并单击具有不断变化的 CSS 选择器的元素(python)
问题描述
我正在编写一个需要单击页面元素的脚本,但是,随着元素位置的变化,CSS 选择器每天都会发生变化。
今天它被称为:
PPTAmFCTable > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(3) > a:nth-child(1)
昨天是:
PPTAmFCTable > tbody:nth-child(1) > tr:nth-child(10) > td:nth-child(3) > a:nth-child(1)
明天可能会是tr:nth-child(13)
这样。
我使用以下代码:
def click_element_bycss(browser,css,timeout):
element_present = EC.presence_of_element_located((By.CSS_SELECTOR,css))
WebDriverWait(browser, timeout).until(element_present)
browser.find_element_by_css_selector(css).click()
接着:
click_element_bycss(browser,"#PPTAmFCTable > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(3) > a:nth-child(1)",4)
在不知道第二个 tr:nth-child() 中的数字的情况下,如何以单击正确元素的方式编写代码?
元素 HTML:
<a href="/FC1/ItemList;jsessionid=E6B3D538CD809FDDC3DE69EA160C956D?WorkPool=PickingNotYetPicked&ExSDRange.RangeEndMillis=1556850660000&ProcessPath=PPTAmFC&ExSDRange.RangeStartMillis=1556850599999&shipmentType=TRANSSHIPMENTS">261</a>
想到了一个循环,它只在 for i in range(1,20): tr:nth-child(i) 中运行,但希望有更聪明的东西。
解决方案
要查找并单击元素,因为该元素是动态元素,您需要诱导WebDriverWait并且element_to_be_clickable()
您可以使用以下任一Locator Strategies:
使用
CSS_SELECTOR
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#PPTAmFCTable>tbody a[href^='/FC1/ItemList'][href$='TRANSSHIPMENTS']"))).click()
使用
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='PPTAmFCTable' and starts-with(@href,'/FC1/ItemList')][contains(@href, 'TRANSSHIPMENTS')]")))
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
推荐阅读
- javascript - 将参数传递给 NodeJS CLI 应用程序中的可执行文件
- html - 内容和背景图像之间的半透明层 - CSS
- ruby-on-rails - Rails 没有从具有多对多关联的模型中保存复选框输入
- javascript - 嵌入消息不更新
- javascript - xmlHttpRequest.send 崩溃 Chrome 扩展
- java - 无法专注于最后一个 EditText
- java - Android Studio 从 AlertDialog 共享文本
- ios - 使用外部类更改 tableView 触摸上的视图控制器
- java - Android - GridView 中的按钮连续单击
- c++ - 需要对 C++ 中的堆栈和模板进行一些说明