所以我开始接受while循环的问题,但是当在selenium代码上使用while循环时,我会做空。
我正试图复制任务10次,这是代码的样子
Main.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('https://orlando.craigslist.org/search/cta')
owl = driver.find_element_by_xpath('//*[@id="sortable-results"]/ul/li/p/a')
res = 1
while res < 10:
owl2 = owl.click()
driver.find_element_by_xpath('/html/body/section/header/nav/ul/li[3]/p/a').click()
res = res + 1
这是错误
追踪(最近一次通话): 文件“main.py”,第12行,in owl2 = owl.click() 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py”, 第77行,点击 self._execute(Command.CLICK_ELEMENT) 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py”, 第491行,在_execute中 return self._parent.execute(command,params) 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py”, 第238行,执行中 self.error_handler.check_response(响应) 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/errorhandler.py”, 第193行,在check_response中 提出exception_class(消息,屏幕,堆栈跟踪) selenium.common.exceptions.StaleElementReferenceException:消息:陈旧元素引用:元素未附加到页面 文献 (会议信息:chrome = 56.0.2924.87) (驱动信息:chromedriver = 2.27.440174(e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform = Mac OS X 10.11.2 x86_64的)
任何建议?
答案 0 :(得分:4)
每次DOM正在更改或刷新driver
时,它之前定位的元素都会导致错误。
StaleElementReferenceException:消息:陈旧元素引用: 元素未附加到页面文档
您需要重新定位它们才能与它们进行交互。此外,click()
不会返回任何值,因此您无法将其分配给任何内容
res = 1
while res < 10:
owl = driver.find_element_by_xpath('//*[@id="sortable-results"]/ul/li/p/a')
owl.click()
driver.find_element_by_xpath('/html/body/section/header/nav/ul/li[3]/p/a').click()
res = res + 1
修改
对于所有项目使用for
循环,您可以将项目定位到列表中并按索引单击
size = len(driver.find_elements_by_xpath('//*[@id="sortable-results"]/ul/li/p/a'))
for i in range(0, size):
owl = driver.find_elements_by_xpath('//*[@id="sortable-results"]/ul/li/p/a')
owl[i].click()
driver.find_element_by_xpath('/html/body/section/header/nav/ul/li[3]/p/a').click()
答案 1 :(得分:2)
错误消息为我们提供了线索:
Message: stale element reference: element is not attached to the page document
这里发生的是你点击一个链接,然后导航到另一个页面,因此你会得到陈旧的元素,因为你在另一个页面上。 您将需要导航回同一页面,尝试以下内容:
driver.execute_script("window.history.go(-1)")
在click()事件之后。
答案 2 :(得分:0)
非常简单地说:您必须使用循环启动测试用例,这意味着“ for”必须是测试用例中的第一个命令,之后的所有内容。 示例:
def test_case(self):
login_page = LoginPage(self.driver)
for element in element_to_check:
assert element
不起作用。它在第一个循环后停止。而是像这样重写代码:
def test_case(self):
for element in element_to_check:
login_page = LoginPage(self.driver)
assert element
答案 3 :(得分:-1)
While 循环用于在指定次数内重复运行代码块,除非满足定义的条件。似乎 DOM 没有重新加载先前定位的代码。如果它不起作用或者您想尽快开始大规模执行,那么您应该尝试 ProxyCrawl API 并使用以下代码来获得您想要的结果。
<块引用>源代码:
def scrape():
url = input("Enter the Profile url: ")
wait.until(EC.url_to_be(("https://www.facebook.com/")))
driver.get(url)
time.sleep(1)
i = 1
while i < 4:
comment = wait.until(EC.visibility_of_element_located((By.XPATH,'/html/body/div[1]/div/div[1]/div/div[3]/div/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div[2]/div[3]/div['+str(i)+']/div/div/div/div/div/div/div/div/div/div/div[2]/div/div[4]/div/div/div[1]/div/div[1]/div/div[2]/div[1]/div/span'))).text
print(comment)
i += 1
i = 1
while i<4:
likes = wait.until(EC.visibility_of_element_located((By.XPATH,'/html/body/div[1]/div/div[1]/div/div[3]/div/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div[2]/div[3]/div['+str(i)+']/div/div/div/div/div/div/div/div/div/div/div[2]/div/div[4]/div/div/div[1]/div/div[1]/div[1]/div[1]/div/span/div/span[2]/span/span'))).text
print(likes)
i += 1
i = 1
while i<4:
share = wait.until(EC.visibility_of_element_located((By.XPATH,'/html/body/div[1]/div/div[1]/div/div[3]/div/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div[2]/div[3]/div['+str(i)+']/div/div/div/div/div/div/div/div/div/div/div[2]/div/div[4]/div/div/div[1]/div/div[1]/div[1]/div[2]/div[2]/span/div/span'))).text
print(share)
i += 1
i = 1
while i<4:
post = wait.until(EC.visibility_of_element_located((By.XPATH,'/html/body/div[1]/div/div[1]/div/div[3]/div/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div[2]/div[3]/div['+str(i)+']/div/div/div/div/div/div/div/div/div/div/div[2]/div/div[3]/blockquote/span/div[1]'))).text
print(post)
i +=1
scrape()