В Selenium для получения URL-адреса активной вкладки попробуйте
from selenium import webdriver
driver = webdriver.Firefox()
print driver.current_url # This will print the URL of the Active link
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)
print driver.current_url
Я здесь просто предоставляю вам псевдокод.
Вы можете поместить это в цикл и создать свой собственный поток.
Я новичок в Stackoverflow, поэтому все еще учусь писать правильные ответы.
Вы думали об использовании аннотаций для отметки полей, которые вы хотите проверить в своем компоненте?
Если у вас есть 10 различных проверок, вы можете указать 10 аннотаций. Затем отметьте поля с помощью аннотаций:
@ValideStringIsCapitalCase
private String myString;
@ValidateIsNegative
private int myInt;
С помощью API отражения переберите все поля и посмотрите, помечены ли они, примерно так:
public static <T> validateBean(T myBean) throws IllegalAccessException {
Field[] fields = myBean.getClass().getDeclaredFields();
// This does not take fields of superclass into account
if (fields != null) {
for (Field field : allFields) {
if (field.isAnnotationPresent(ValideStringIsCapitalCase.class)) {
field.setAccessible(true);
Object value = field.get(existingEntity);
// Validate
field.setAccessible(false);
}
}
}
}
Можно пометить весь класс валидатором, который вы хотите использовать.
РЕДАКТИРОВАТЬ: не забудьте включить аннотацию:
@Retention(RetentionPolicy.RUNTIME)
для вашего интерфейса аннотаций.
РЕДАКТИРОВАТЬ2: пожалуйста, не изменяйте поля напрямую (как в примере выше).
Я, вероятно, неправильно понял вопрос, но мне бы хватило чего-то вроде этого:
public class ValidationMappings {
private Map<Class, Class<Validation>[]> mappings = new HashMap<Class, Class<Validation>[]>();
public ValidationMappings() {
mappings.put(A.class, new Class[]{XYZValidation.class, ABCValidation.class});
mappings.put(B.class, new Class[]{ABCValidation.class, PPPValidation.class});
}
public Class[] getValidators(Class cls) {
if (!mappings.containsKey(cls)) return new Class[]{};
return mappings.get(cls);
}
}
Когда вы хотите получить список валидаторов для определенного класса, вы должны затем вызвать getValidators (Class cls) и перебрать каждый валидатор и создать экземпляр каждого и вызовите свой метод проверки.
Если вы просто хотите, чтобы он работал с любым объектом, то ваш интерфейс будет объектом
public boolean check (Object o);
Если вы не хотите использовать какой-либо интерфейс маркера для маркировки классов, подходящих для проверки
может быть что-то вроде этого?
interface Validation {
public boolean check(Validatable x);
}
interface Validatable {
}
class A implements Validatable {
...
}
class Validator {
public boolean validateObject(Validatable x){
boolean validated = true;
... //read config file, check which validation classes to call
//for each validation class v in the config file:
if(!v.check(x)) validated = false;
return validated;
}
}
Возможно, вы имели в виду:
public interface Validation<T> {
boolean check(T object)
}
Прежде всего, я бы использовал следующий интерфейс
interface Validator {
boolean isValid(Object object);
}
, чтобы неявно задокументировать, что на самом деле означает возвращаемое значение.
Во-вторых, я бы предложил задокументировать в интерфейсе, какое поведение ожидается, если Валидатор не знает, как обрабатывать данный экземпляр.
interface Validator {
/**
* @return false if this validator detects that the given instance is invalid, true if the given object is valid or this Validator can't validate it.
*/
boolean isValid(Object object);
}
Таким образом, у вас будет просто Список Валидаторов, в которые вы можете использовать свои объекты.
Влияние несовместимых Валидаторов на производительность должно быть незначительно, если они реализованы правильно, например, с ранним instanceof.
Кстати, я бы использовал список валидаторов вместо набора, чтобы вы могли упорядочить их по сложности. Поместите дешевые (с точки зрения производительности) валидаторы в начале списка для оптимизации.
Затем вы можете использовать общий фрагмент кода для проверки, например
public class Validators {
public static boolean isValid(Object o, Collection<Validator> validators) {
for(Validator current : validators) {
if(!current.isValid()) return false;
}
return true;
}
}
В зависимости от вашего варианта использования было бы неплохо вернуть в интерфейс что-то отличное от логического. Если вам нужна информация о , что неверно, например, чтобы отобразить его, вам нужно вместо этого вернуть эту информацию.
В этом случае было бы неплохо оставить цикл выше, чтобы вы будут получать все ошибки проверки, а не только первую.
Паттерн посетитель решит эту проблему
Вызов валидатора посетителя, можно получить следующее:
public interface Validatable { public boolean validate(Validator v); } public interface Validator { public boolean validate(A a); public boolean validate(B b); } public class A implements Validatable { public boolean validate(Validator v){ return v.validate(this); } } public class B implements Validatable { public void validate(Validator v) { return v.validate(this); } } // Default validator just doesn't know how to // validate neither A's, nor B's public class GenericValidator implements Validator { public boolean validate(A a) { throw new UnsupportedOperationException("Cannot validate A"); } public boolean validate(B b) { throw new UnsupportedOperationException("Cannot validate B"); } } // since XYZValidation is supposed to run only on A's // it only overrides A validation public class XYZValidation extends GenericValidator { public boolean validate(A a) { // validate a return isVAlid(a); } } // since ABCValidation is supposed to run on A's and B's // it overrides A and B validation public class ABCValidation extends GenericValidator { public boolean validate(A a) { // validate a return isVAlid(a); } public boolean validate(B b) { // validate b return isVAlid(b); } } // since ABCValidation is supposed to run only on B's // it overrides A only B validation public class PPPValidation extends GenericValidator { public boolean validate(B b) { // validate b return isVAlid(b); } }