你的代码只会在第一次成功运行,也就是它会点击第二页,然后它会在这一行抛出一个Stale Element Reference Exception -
page.click()
现在,这是为什么呢?这是因为page WebElement 只不过是您在单击一次之前识别的元素列表pages 的成员。由于单击分页按钮一次后,DOM 发生了 更改 ,因此对您之前定位的元素的引用不再有意义。
要解决这个问题,您需要在每次 DOM 更改时(即每次单击分页按钮时)一次又一次地不断寻找分页按钮。一个简单的解决方案是使用您的 counter 变量来遍历您的列表。这是完整的代码-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome(executable_path=r'//path to driver')
driver.get("google url")
driver.find_element_by_id("lst-ib").send_keys("search")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)
driver.maximize_window()
pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter=1
for page in pages:
pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter+=1
pages[counter].click()
另一种(更好的)解决方案是通过文本识别分页按钮 -
pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter=2 #starting from 2
for page in pages:
driver.find_element_by_xpath("//a[text() = '" + str(counter) + "']").click()
counter+=1
您也可以尝试按“下一步”按钮:
pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter=2 #starting from 2
for page in pages:
driver.find_element_by_xpath("//span[text()='Next']").click()
counter+=1
编辑 -
我修复了你的最终代码。我重命名了一些变量,以免您感到困惑,并将您的隐式等待替换为 explicit waits。
import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
class GoogleEveryFirstLink(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(executable_path=r'D:\Test automation\chromedriver.exe')
self.driver.get("http://www.google.com")
def test_Hover_Facebook(self):
driver = self.driver
self.assertIn("Google",driver.title)
elem=driver.find_element_by_id("lst-ib")
elem.clear()
elem.send_keys("India")
elem.send_keys(Keys.RETURN)
page_counter=2
links_counter=1
wait = WebDriverWait(driver,20)
wait.until(EC.element_to_be_clickable((By.XPATH,"(//h3[@class='r']/a)[" + str(links_counter) + "]")))
pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
elem1=driver.find_elements_by_xpath("//h3[@class='r']/a")
print len(elem1)
print len(pages)
driver.maximize_window()
for page in pages:
for e in elem1:
my_link = driver.find_element_by_xpath("(//h3[@class='r']/a)[" + str(links_counter) + "]")
print my_link.text
my_link.click()
driver.back()
links_counter+=1
my_page = driver.find_element_by_xpath("//a[text() = '" + str(page_counter) + "']")
my_page.click()
page_counter+=1
def tearDown(self):
self.driver.close()
if __name__=="__main__":
unittest.main()