我正在编写一个脚本,该脚本需要单击页面的某个元素,但是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)这样。
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>
考虑到一个循环,该循环仅在range(1,20)中的i中运行:tr:nth-child(i),但希望有更智能的东西。
要查找并单击该元素,因为该元素是动态元素,则需要为引入 WebDriverWait ,element_to_be_clickable()并且可以使用以下定位策略之一:
element_to_be_clickable()
使用CSS_SELECTOR:
CSS_SELECTOR
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#PPTAmFCTable>tbody a[href^='/FC1/ItemList'][href$='TRANSSHIPMENTS']"))).click()
使用XPATH:
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