如何使用selenium-webdriver

时间:2016-02-03 07:35:34

标签: python selenium-webdriver

我遇到以下任务的问题:

  1. 打开Goog​​le首页
  2. 搜索表单中的类型请求
  3. 选择url与某个给定网址匹配的结果(例如http://www.theguardian.com
  4. 目前我有这个脚本:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.Firefox()
    driver.get("https://google.com/")
    
    search_form = driver.find_element_by_xpath("/html/body/div/div[3]/form/div[2]/div[2]/div[1]/div[1]/div[3]/div/div[3]/div/input[1]")
    search_form.send_keys("guardian")
    search_form.send_keys(Keys.ENTER)
    
    driver.find_element_by_xpath('//a[starts-with(@href,"http://www.theguardian.com")]').click()
    

    它成功执行前2个子任务但在最后一行抛出异常时:

    selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//a[starts-with(@href,\"http://www.theguardian.com\")]"}
    

    我也有这个脚本只满足最后一个子任务:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    q = "guardian"
    browser = webdriver.Firefox()
    body = browser.find_element_by_tag_name("body")
    body.send_keys(Keys.CONTROL + 't')
    
    browser.get("https://www.google.com/search?q=" + q + "&start=" + str(counter))
    browser.find_element_by_xpath('//a[starts-with(@href,"http://www.theguardian.com")]').click()
    

    我工作正常。我的问题是为什么第一个脚本会抛出异常,我该如何修改它,以便它像第二个脚本那样打开搜索结果?

    更新

    正如Bart和Shubham在评论中提到的,问题在于我试图在页面上找到尚未加载的元素。因此,解决方案是使用等待'

    Selenium-webdriver提供两种类型的等待' - documentation中的显式隐式更多内容。

    对于我的解决方案,我使用隐式等待。基本上,它告诉WebDriver等待一定时间来找到一个元素,如果它不能立即可用。

    为此,我只在脚本中添加了1行:

    driver.implicitly_wait(5)
    

3 个答案:

答案 0 :(得分:1)

可能这是因为第一个版本的元素尚未出现在页面上。如果你创建一个"等到元素存在"这种循环(不知道它是否存在于心脏中)然后它应该起作用。

第二个例子确实有效,因为只有在加载页面时,browser.get才会返回。

答案 1 :(得分:0)

您可以执行以下操作...

尝试从第一个位置等待

代码在java中,但它与python非常相似/接近,从中获取引用

您可以在HTML DOM中每次检查元素是否存在,以防止出现错误/错误的脚本。如下: -

  if (driver.findElements(By.xpath('//a[starts-with(@href,"http://www.theguardian.com')).size() != 0) {  
            YOUR FIRST Working code  
            System.out.println("element exists");     
        }  
  else{
           Your second working code    
      }

希望它会对你有所帮助:)。

答案 2 :(得分:0)

在此视频中,您可以看到如何完成: https://www.youtube.com/watch?v=IUBwtLG9hbs

转到12:30观看它的实际效果:转到google.com,在搜索框中输入内容,然后点击搜索结果。