硒虽然循环不起作用

时间:2017-03-11 17:13:15

标签: python selenium selenium-webdriver

所以我开始接受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的)

任何建议?

4 个答案:

答案 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()