我如何在while循环中执行“find.element.by ....”?

时间:2017-11-30 17:30:44

标签: python selenium selenium-chromedriver

使用Selenium python,我想循环浏览每个“文本链接”中的页面,同时存在“文本链接”

代码:

while(driver.find_element_by_link_text("Txt link") == True): 
    driver.find_element_by_link_text("Txt link").click()
  

错误分期

     

Traceback(最近一次调用最后一次):文件“phishing.py”,第8行,in          类报告(unittest.TestCase):在报告中输入第26行“phishing.py”       while(driver.find_element_by_link_text(“Ver mais ...”)):文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,   第389行,在find_element_by_link_text中       return self.find_element(by = By.LINK_TEXT,value = link_text)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,   第855行,在find_element中       'value':value})['value']文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,   第308行,执行中       self.error_handler.check_response(response)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,   第194行,在check_response中       提出exception_class(message,screen,stacktrace)selenium.common.exceptions.NoSuchElementException:消息:没有这样的   element:无法定位元素:{“method”:“link   文本“,”选择器“:”Ver mais ......“

7 个答案:

答案 0 :(得分:1)

如果我们使用while(driver.find_element_by_link_text("Txt link") == True): or while(driver.find_element_by_link_text("Txt link").is_displayed() == True):

如果元素没有显示,那么呢?它会抛出异常吗?所以去WebDriverWait等待元素。

在Java中,我使用try / catch并在try中放置,如果我希望有些时候该元素可能不可用但仍需要进一步移动。

答案 1 :(得分:0)

您可以通过以下方式解决问题:

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.common.exceptions import TimeoutException

while True:
    wait(driver, 5).until(EC.element_to_be_clickable((By.LINK_TEXT, "Txt link"))).click()
except TimeoutException:
    break

这应该允许您在链接可用时单击该链接

答案 2 :(得分:0)

当以下语句无法在给定页面上找到webElement时,将抛出noSuchElementFoundException。您必须捕获该异常以避免执行暂停。

   driver.find_element_by_link_text("Txt link")

并且你必须将循环逻辑纠正为有限状态。如果不指定初始计数和增量策略,则无法在单个项目上运行循环。

答案 3 :(得分:0)

您必须使用FindElements而不是findElement将其存储在列表中,并使用for循环遍历列表。每当你尝试相同的元素时,那就是问题。

使用FindElements,它会将所有元素放在列表中,您的问题就会得到解决。

@note:如果打开一个新的浏览器窗口,点击链接后,你也需要处理它。

答案 4 :(得分:0)

必须使用时间睡眠,尤其是对于包含许多可点击元素的大页面而言。因为在进行第一次单击时,必须加载该页面才能进行第二次单击。

import time
while(driver.find_element_by_link_text("Txt link")):
   driver.find_element_by_link_text("Txt link").click()
   time.sleep(3)

答案 5 :(得分:0)

创建了一个很好的解决方法。下面的代码每十秒钟刷新一次页面,以查找所需的元素。循环最多400秒

    y = 1
    while y < 400:

        try:
            driver.refresh()
            driver.find_element_by_link_text("Txt link").click()
            y = 401
        except:
            time.sleep(10)
            y = y + 10

答案 6 :(得分:-1)

您可以尝试以下代码: -

 while(driver.find_element_by_link_text("Txt link").is_displayed() == True): 
        driver.find_element_by_link_text("Txt link").click()