我在python中使用selenium模块创建了一个小程序。
下面是我的代码:while True:
try:
btnOptions = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/...."))).click()
firstElement = driver.find_elements(By.XPATH, "//*[text()='Click']")
if not firstElement:
tnTrash = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[text()='Move']"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,
"/html/body/..."))).click()
else:
firstElement.click()
except NoSuchElementException:
break
循环应该做:
步骤1:找到btnotion按钮->btnooptions = WebDriverWait(driver, 10).until(EC.element_to_be_clickable())XPATH,"/html/…"))).click ()
菜单打开,在该菜单中可以有element1或element2;从来不会同时发生这两件事。例如,
element1 is :
WebDriverWait(driver, 10).until(driver.find_elements(By.XPATH, "//*[text()='element1']"))
element2 is :
WebDriverWait(driver, 10).until(driver.find_elements(By.XPATH, "//*[text()='element2']"))
步骤2:如果找到元素1,则单击它并在开始处重新开始循环。如果找到的是element2,单击它并在开始处重新开始循环。
如果是要删除的帖子,element1出现在下拉菜单中,如果是个人资料照片,element2出现在下拉菜单中。
只要找到element1,程序就会继续,如果找到的是element2,程序就会停止,并显示一个错误,告诉我没有找到element1
我想过了,但还是不行:
while True:
try:
btnOptions = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div..."))).click()
WebDriverWait(driver, 20).until(driver.find_element(By.XPATH("//*[text()='move to trash']"))).click() or WebDriverWait(driver, 20).until(driver.find_element(By.XPATH("//*[text()='Do not show in profile']"))).click()
except NoSuchElementException:
break
您可以尝试这样做:
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "my_element"))).click()
except:
while True:
try:
btnOptions = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html/body/div["
"1]/div/div["
"1]/div/div["
"5]/div/div/div["
"3]/div/div/div["
"1]/div["
"1]/div/div/div["
"4]/div[2]/div/div["
"2]/div[3]/div["
"3]/div/div/div/div"
"/div/div/div/div/div"
"/div/div["
"8]/div/div/div["
"2]/div/div["
"3]/div/div")))
time.sleep(2)
btnOptions.click()
time.sleep(2)
btnTrash = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[text()='Déplacer "
"dans la corbeille']")))
time.sleep(1)
btnTrash.click()
time.sleep(1)
btn_move = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,
"/html/body/div[1]/div/div["
"1]/div/div[ "
"6]/div/div/div[1]/div/div["
"2]/div/div/div/div/div/div/div["
"3]/div/div/div/div[1]")))
time.sleep(1)
btn_move.click()
time.sleep(7)
except NoSuchElementException:
break
你试着点击你的元素,如果ok则代码将继续在except块之后,如果点击失败意味着元素不在那里,所以它将运行你预期的代码到except块
验证元素存在的最干净的方法是使用find_elements
方法,因为在这种情况下,如果没有找到元素,就不会抛出异常。
你的代码中有几个问题需要改进:
- 既然你在这里点击元素,你应该使用
element_to_be_clickable
expected_conditions
,而不是presence_of_element_located
。 - 当你使用
WebDriverWait
expected_conditions
时,不需要在动作之间添加睡眠
3)你可以直接在返回的web元素对象上执行click()
,不需要把它放在临时变量中。
你的定位器应该改进,但我帮不了你,因为我不知道你在哪个页面上工作。
所以,你的代码可以像这样:
first_element_list = driver.find_elements(By.XPATH,"the_element_locator")
if first_element_list:
first_element_list[0].click()
else:
while True:
try:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[1]/div/div[5]/div/div/div[3]/div/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div[2]/div[3]/div[3]/div/div/div/div/div/div/div/div/div/div/div[8]/div/div/div[2]/div/div[3]/div/div"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//*[text()='Déplacer dans la corbeille']"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[1]/div/div[6]/div/div/div[1]/div/div[2]/div/div/div/div/div/div/div[3]/div/div/div/div[1]"))).click()
except NoSuchElementException:
break