【问题标题】:Executing a script in selenium python在 selenium python 中执行脚本
【发布时间】:2015-06-05 07:53:51
【问题描述】:

我正在尝试在 selenium 中执行此脚本。

<div class="vbseo_liked">
<a href="http://www.jamiiforums.com/member.php?u=8355" rel="nofollow">Nyaralego</a>
,
<a href="http://www.jamiiforums.com/member.php?u=8870" rel="nofollow">Sikonge</a>
,
<a href="http://www.jamiiforums.com/member.php?u=8979" rel="nofollow">Ab-Titchaz</a>
and
<a onclick="return vbseoui.others_click(this)" href="http://www.jamiiforums.com/kenyan-news/225589-kenyan-and-tanzanian-surburbs.html#">11 others</a>
like this.
</div>

这是我执行它的代码。

browser.execute_script("document.getElement(By.xpath(\"//div[@class='vbseo_liked']/a[contains(@onclick, 'return vbseoui.others_click(this)')]\").click()")

没有用。我做错了什么?

【问题讨论】:

    标签: javascript python html selenium web-scraping


    【解决方案1】:

    找到带有 selenium 的元素并将其传递给execute_script() 以点击:

    link = browser.find_element_by_xpath('//div[@class="vbseo_liked"]/a[contains(@onclick, "return vbseoui.others_click(this)")]')
    browser.execute_script('arguments[0].click();', link)
    

    由于我知道问题的背景,以下是您要解决的一系列问题:

    • 依靠此处提供的解决方案,通过 javascript 单击“11 个其他人”链接:How to simulate a click with JavaScript?
    • 创建一个custom expected condition 以等待元素文本不以“11 others like this”结尾。文本(这是您在Expected conditions with selenium 遇到的问题的解决方案):

      class wait_for_text_not_to_end_with(object):
          def __init__(self, locator, text):
              self.locator = locator
              self.text = text
      
          def __call__(self, driver):
              try :
                  element_text = EC._find_element(driver, self.locator).text.strip()
                  return not element_text.endswith(self.text)
              except StaleElementReferenceException:
                  return False
      

    实施:

    from selenium import webdriver
    from selenium.common.exceptions import StaleElementReferenceException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    class wait_for_text_not_to_end_with(object):
        def __init__(self, locator, text):
            self.locator = locator
            self.text = text
    
        def __call__(self, driver):
            try :
                element_text = EC._find_element(driver, self.locator).text.strip()
                return not element_text.endswith(self.text)
            except StaleElementReferenceException:
                return False
    
    
    browser = webdriver.PhantomJS()
    browser.maximize_window()
    browser.get("http://www.jamiiforums.com/kenyan-news/225589-kenyan-and-tanzanian-surburbs.html")
    
    username = browser.find_element_by_id("navbar_username")
    password = browser.find_element_by_name("vb_login_password_hint")
    
    username.send_keys("MarioP")
    password.send_keys("codeswitching")
    
    browser.find_element_by_class_name("loginbutton").click()
    
    wait = WebDriverWait(browser, 30)
    wait.until(EC.visibility_of_element_located((By.XPATH, '//h2[contains(., "Redirecting")]')))
    wait.until(EC.title_contains('Kenyan & Tanzanian'))
    wait.until(EC.visibility_of_element_located((By.ID, 'postlist')))
    
    # click "11 others" link
    link = browser.find_element_by_xpath('//div[@class="vbseo_liked"]/a[contains(@onclick, "return vbseoui.others_click(this)")]')
    link.click()
    browser.execute_script("""
    function eventFire(el, etype){
      if (el.fireEvent) {
        el.fireEvent('on' + etype);
      } else {
        var evObj = document.createEvent('Events');
        evObj.initEvent(etype, true, false);
        el.dispatchEvent(evObj);
      }
    }
    
    eventFire(arguments[0], "click");
    """, link)
    
    # wait for the "div" not to end with "11 others link this."
    wait.until(wait_for_text_not_to_end_with((By.CLASS_NAME, 'vbseo_liked'), "11 others like this."))
    
    print 'success!!'
    browser.close()
    

    【讨论】:

    • selenium.common.exceptions.WebDriverException: Message: {"errorMessage":"'undefined' is not a function (evalating 'arguments[0].click()')",
    • 这是它给我的错误信息。不知道是什么原因。
    • 文件 "sele.py",第 55 行,在 wait.until(wait_for_text_not_to_end_with((By.CLASS_NAME, 'vbseo_liked'), "11 others like this.")) 文件 "/ Library/Python/2.7/site-packages/selenium/webdriver/support/wait.py",第 75 行,直到引发 TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: 消息:
    • @user3078335 增加超时时间,例如50 而不是 30。该解决方案对我有用。
    • 我收到了这个错误。我觉得我欠你一杯啤酒。非常感谢您的所有努力!
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2019-05-17
    • 2017-08-30
    • 2019-04-16
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多