find_element_by_path только видимый элемент ‹class› ‹div id=xxxx›

Однако я пытался использовать только видимые элементы xpath

# ============================================================
#import codecs
#import requests
#import html5lib
#import string
import lxml.html as lh
from lxml import etree
import urllib
import urllib2
import os
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from bs4 import BeautifulSoup
from pandas import *
import re
from datetime import datetime
from dateutil import parser
import time
import os
import inspect
import itertools

chromedriver = "chromedriver_win32.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(chromedriver)
URL = 'http://odds.7m.hk/en/default.shtml?t=3&dt=2011-08-13'
browser.get(URL)

#expend the wrapped/collapsed event list which includes leagues
browser.find_element_by_xpath('//*[@id="hlistMatch"]').click()

#only omit the checkbox ENG Premier League id @value='92'
checkboxes = browser.find_elements_by_xpath('//input[@name="c_league" and not(@value="92") and @checked="checked"]')
for checkbox in checkboxes:
    if checkbox.is_selected():
        checkbox.click()
browser.find_element_by_xpath('//*[@id="league_input"]/span[1]/a').click()

browser.find_elements_by_xpath('//input[@id="bh473558"]/div')
Out[70]: []

Почему обычный find_element_by_xpath ничего не нашел[]? Я хотел бы получить только видимый элемент идентификатора. Здесь я прикрепляю свой скриншот по ссылке ниже. Какое-то тело затеняет меня светом?

Мой вопрос: видимые и невидимые элементы

Нужны локаторы xpath для видимых элементов


person ケンジ リュスケ    schedule 11.03.2014    source источник
comment
XPath не имеет понятия или концепции видимого или отображаемого элемента. Для XPath (или любого другого локатора в этом отношении) элемент является элементом, независимо от того, как он показан пользователю. Затем задачей Selenium становится определить, действительно ли отображается этот элемент. Мне кажется, что идентификатор (bh473558) в этом XPath имеет тенденцию меняться и не является статичным, поэтому не будет возвращать набор стабильных и надежных результатов.   -  person Arran    schedule 12.03.2014


Ответы (2)


Вы всегда можете отфильтровать невидимые элементы:

var ele = Driver.FindElementsByXpath("xpath");
var visibleEle;
visibleEle.AddRange(ele.Where(t => t.Displayed));
person Ravi Chaudhary    schedule 12.03.2014
comment
Это не код C#, который можно скомпилировать (т.е. var не является List), а OP использует python. - person Arran; 12.03.2014
comment
Это список. Вам нужно будет определить его в соответствии с вашими потребностями var visibleEle = new List<"Your data type">(); - person Ravi Chaudhary; 12.03.2014

Я понял, это работает... Однако код слишком длинный.

lnk = soup.findAll('a', attrs={'class':['team_ls','lot_icon0'],
             'href':re.compile('http://data.7m.cn/matches_data/92/en/index.shtml|http://data.7m.cn/analyse/en/')})
EngPR = soup.findAll('a', href=re.compile('http://data.7m.cn/matches_data/92/en/index.shtml'))

matchID = []
df = lnk
for i in range(len(lnk)):
    if EngPR[0]['href'] == lnk[i]['href']:
        # re.findall(r'.*?([0-9]+)', dflist[0])
        # Out[162]: ['7', '473558']
        # [-1] to delete the 1st matched digit which is http://data.'7'm.cn
        df = re.findall(r'.*?([0-9]+)', lnk[i+1]['href'])[-1]
        matchID.append(df)
del lnk; del EngPR; del df; del i
person ケンジ リュスケ    schedule 17.03.2014